尽管以纵向视图录制,但使用 mediaRecorder 和表面视图录制的 Android 视频无法在横向视图中播放
Posted
技术标签:
【中文标题】尽管以纵向视图录制,但使用 mediaRecorder 和表面视图录制的 Android 视频无法在横向视图中播放【英文标题】:Android video recorded using mediaRecorder and surface view doesn't play in Landscape View although recorded in Portrait View 【发布时间】:2016-08-01 05:10:05 【问题描述】:我正在开发一个应用程序,我必须在其中录制一个应该在 Portrait View
中的视频,并在 Portrait View
中播放它。我正在使用mediaRecorder
录制视频。
已使用本站作为参考:https://examples.javacodegeeks.com/android/core/android-video-capture-example/
并根据我的要求进行了细微的更改:
代码如下:
对于相机,我使用以下设置:
mCamera = Camera.open(findFrontFacingCamera());
mCamera.setDisplayOrientation(90);
Camera.Parameters params= mCamera.getParameters();
params.set("rotation", 90);
params.set("orientation", "portrait");
mCamera.setParameters(params);
mPreview.refreshCamera(mCamera);
我现在面临的问题是视频在Portrait View
中被录制(看起来是这样),但是当我使用任何播放器播放它时,例如。 MX Player 我得到一个在Landscape View
录制/播放的视频。
以下是供参考的屏幕:
播放的视频:
我使用了setDisplayOrientation(90)
参数,但它不起作用。
我如何实现我想要实现的目标?
【问题讨论】:
【参考方案1】:与 ios 相机不同,我们无法在 Android 上真正选择人像相机框架方向。
Camera.setDisplayOrientation()
仅指摄像头实时预览视频的方向;实际的帧数据永远不会在 Android 上旋转。如果您使用 onPreviewFrame() 回调,您可以看到它。 Camera.setRotation()
仅影响 onPictureTaken()
回调,并且在大多数设备上仅设置 EXIF 旋转标志。
通过名称显式设置“旋转”和“方向”是危险的:一些设备可能会识别这些键,其他设备会默默地忽略它们,而其他 ROM 可能会在 Camera.setParameters()
具有意外键或值的参数时抛出 RuntimeException已收到。但无论如何,我从来没有见过在任何这些标志时更改录制的视频帧的 Android 设备。
您有MediaRecorder.setOrientationHint()
API,但它不会旋转录制视频的帧,只会在视频标题中放置一个标志。
因此,很遗憾,您必须在接收端旋转视频。这取决于您渲染视频的方式,是的,您可以根据需要检查方向提示。
【讨论】:
有什么建议可以让我自己做吗?您知道的任何参考来源? 我也已经使用了 setOrientationHint() 但它仍然无法正常工作。 “不工作”是什么意思?你检查接收器上的这个标志吗? 如何渲染视频?如果你使用 OpenGL 纹理,你可以应用一个变换矩阵,比如***.com/questions/29518560/… 我想我明白了问题所在。我一直在运行 6.0.1 的 Nexus 7 上测试该应用程序。当我在其他设备上测试时:三星 S3、松下 Eluga One、华硕 Zenphone 2、MI4i、Moto G3,我发现它工作正常。所以我认为nexus 7有问题。感谢您的帮助!以上是关于尽管以纵向视图录制,但使用 mediaRecorder 和表面视图录制的 Android 视频无法在横向视图中播放的主要内容,如果未能解决你的问题,请参考以下文章
Android 如何使用 MediaRecorder 录制音频并输出为原始 PCM?