Неправильная ориентация при записи видео

Я использую 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();
    }
}

0 ответов

Другие вопросы по тегам