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