Неправильная ориентация при записи видео
Я использую Android-камеру для записи видео из моего приложения, я использую класс android.hardware.Camera
для этого.
Мое приложение все портретное. Моя проблема, когда начать фактическую запись mMediaRecorder.start()
во время записи камера поворачивается в горизонтальное положение и выдает странный предварительный просмотр:
После добавления mCameraPreview.setRotation(90)
Мой предварительный просмотр камеры работает нормально, но предварительный просмотр во время записи неподвижного портрета:
Странная вещь после записи при просмотре или отображении видео, это в портретном режиме, и все в порядке с самим видео:
Итак, проблема только в виде камеры во время записи видео, которую я пытаюсь исправить с помощью всех доступных возможностей, но ничего не получил, таких проблем на SO есть десятки, но я ни один из них не решает мою проблему Я попробовал это и это и это, но ничего не работает для меня.
Я собираюсь так:
в MyRecordingActivity.Java:
mCamera = getCameraInstance(); // Camera instance
mCameraPreview = new CameraPreview(this, mCamera); // SurfaceView with SurfaceHolder.Callback
preview.addView(mCameraPreview); // the view that is used to contain the camera preview (it is a FrameLayout)
в CameraPreview.java SurfaceView
:
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {
Camera.Parameters parameters = mCamera.getParameters();
parameters.set("orientation", "portrait");
parameters.set("rotation",90);
mCamera.setParameters(parameters);
mCamera.setDisplayOrientation(90);
openCamera(); // a HandlerThread to open the camera
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
// to initialize & prepare the MediaRecorder
initRecorder();
prepareRecorder();
} catch (IOException e) {}
}
/**
* Initializing the video recorder
*/
public void initRecorder() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
CamcorderProfile cpHigh = CamcorderProfile
.get(CamcorderProfile.QUALITY_HIGH);
recorder.setProfile(cpHigh);
recorder.setOutputFile(getOutputMediaFile(false).getAbsolutePath());
recorder.setMaxDuration(20000); // 20 seconds
}
/**
* Preparing the video recorder
*/
public void prepareRecorder() {
recorder.setPreviewDisplay(mCameraPreview.mSurfaceHolder.getSurface());
recorder.setOrientationHint(90);
try {
recorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
finish();
} catch (IOException e) {
e.printStackTrace();
finish();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
int width, int height) {
// start preview with new settings
try {
mCamera.setDisplayOrientation(90);
mCamera.setPreviewDisplay(surfaceHolder);
mCamera.startPreview();
//fixVideoPreview();
} catch (Exception e) {
// intentionally left blank for a test
}
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
try {
mCamera.stopPreview();
mCamera.release();
} catch (Exception ex) {
ex.printStackTrace();
}
try {
if (recording) {
recorder.stop();
recording = false;
}
recorder.release();
} catch (Exception ex) {
ex.printStackTrace();
}
}