我正在尝试制作自定义视频应用。我仅使用 list 2.2 (API 8) 中的设置。
一切顺利,但我不明白为什么纵向模式视频与横向视频没有区别。
为了检测设备方向改变,我在 surfaceChanged() 中使用了这段代码
if (mCamera != null) {
Camera.Parameters p = mCamera.getParameters();
try {
mCamera.stopPreview();
} catch (Exception e) {
// TODO: handle exception
}
int previewWidth = 0;
int previewHeight = 0;
if (mPreviewSize != null) {
Display display = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();
switch (rotation) {
case Surface.ROTATION_0:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(90);
break;
case Surface.ROTATION_90:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(0);
break;
case Surface.ROTATION_180:
previewWidth = mPreviewSize.height;
previewHeight = mPreviewSize.width;
mCamera.setDisplayOrientation(270);
break;
case Surface.ROTATION_270:
previewWidth = mPreviewSize.width;
previewHeight = mPreviewSize.height;
mCamera.setDisplayOrientation(180);
break;
}
p.setPreviewSize(previewWidth, previewHeight);
mCamera.setParameters(p);
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.d(TAG, "Cannot start preview.", e);
}
}
像魅力一样工作。如果我旋转设备表面更改方向,调用 surfaceChanged,其中相机设置为适当的 DisplayRotation。
问题是稍后如何确定视频是以横向模式还是纵向模式拍摄的。正如我所获得的,所有视频都是横向拍摄的。它不依赖于仅影响预览过程的 setDisplayOrientation。
同时探索这个问题我注意到,如果使用标准相机应用程序,它会将特殊标签写入视频文件(在 MediaInfo 中看到):Rotation : 90 对于拍摄的肖像视频。
但是 MediaRecorder 类没有。
看来是问题所在。有人必须解决这个问题吗?
最佳答案
找到了! 的确,你可以改变预览,你可以标记视频,但没有办法真正改变视频......(可能是速度问题或其他问题)
camera.setDisplayOrientation(90);
要旋转预览,则
recorder.setOrientationHint(90);
将视频标记为90°旋转,则手机在阅读时会自动旋转。
所以你所要做的就是
camera = Camera.open();
//Set preview with a 90° ortientation
camera.setDisplayOrientation(90);
camera.unlock();
holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
recorder.setOutputFile(getVideoFolder()+rnd.nextString()+".mp4");
recorder.setPreviewDisplay(holder.getSurface());
//Tags the video with a 90° angle in order to tell the phone how to display it
recorder.setOrientationHint(90);
if (recorder != null) {
try {
recorder.prepare();
} catch (IllegalStateException e) {
Log.e("IllegalStateException", e.toString());
} catch (IOException e) {
Log.e("IOException", e.toString());
}
}
recorder.start();
希望对您有所帮助;-)
关于android - 纵向模式下的 MediaRecorder 视频捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11993129/