即使匹配视频大小和预览大小纵横比,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)中将相机预览大小设置为平方纵横比

使用 flexbox 并保持 1:1 的纵横比,即使内容大小不同

调整图像大小以使大小与指定的纵横比匹配[重复]

Android Camera2 以 4:3 纵横比预览和捕捉,但宽度 > 高度