即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败
Posted
技术标签:
【中文标题】即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败【英文标题】:MediaRecorder fails even when matching Video Size and Preview Size aspect ratios 【发布时间】:2014-10-21 13:31:44 【问题描述】:根据Camera.Parameters#getPreferredSizeForVideoPreview 文档:
我们建议选择与要录制的视频分辨率具有相同纵横比的预览尺寸
我发现,在某些设备 (Galaxy S3) 上,选择具有不同纵横比的视频录制大小确实会导致录制视频问题 (green/purple videos)。
当我遵循文档的建议并坚持相同的纵横比时,它大部分都可以工作,但在某些设备(Nexus S / android 4.0.4)上,调用MediaRecorder.start()
失败并显示以下消息:
E/MediaRecorder﹕ start failed: -19
在其他设备 (HTCEVOV4G / Android 4.0.3) 上调用 MediaRecorder.stop
失败并显示以下消息:
E/MediaRecorder﹕ stop failed: -1007
不过,我确实发现,如果我调用MediaRecorder#setVideoSize
时使用与相机预览尺寸完全相同的尺寸,则视频录制工作正常。
【问题讨论】:
【参考方案1】:出现此问题的设备似乎有一个共同点。对Camera.Parameters#getSupportedVideoSizes()
的调用都返回null!根据documentation for getSupportedVideoSizes
,函数会返回:
退货 如果相机具有单独的预览和视频输出,则为 Size 对象列表;否则返回null。
这意味着,对于这些设备,相机的预览和视频输出是相同的,因此设置不同的尺寸,无论纵横比如何,都会产生问题。
可以通过对相机预览大小 (Camera.Parameters#setPreviewSize) 和视频录制大小 (MediaRecorder#setVideoSize) 使用相同的尺寸来解决此问题。
但需要注意的是,并非所有使用相同预览和视频输出的设备都会出现此问题。例如,HTC One Mini (Android 4.4.2) 将即时更改其预览分辨率以匹配视频录制分辨率。虽然没有得到证实,但我的测试让我相信这是使用SurfaceView
作为录制表面而不是使用TextureView
时的问题。在 4.1 之前,recording with a TextureView
was not supported 似乎已被接受,因此 ICS 及以下您需要确保您的预览和视频大小匹配,但在 JB+ 中,这似乎无关紧要。这可能严重依赖设备,我还没有证实这个理论。
啊,是的,安卓的狂野世界!
【讨论】:
以上是关于即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在平方 SurfaceView(如 Instagram)中将相机预览大小设置为平方纵横比