3

我正在使用 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();
    }
}
4

0 回答 0