根据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
,视频录制就会正常工作。
答案 0 :(得分:5)
显示此问题的设备似乎有一个共同点。对Camera.Parameters#getSupportedVideoSizes()
的调用都返回null!根据{{3}},函数将返回:
<强>返回强>
如果摄像机具有单独的预览和视频输出,则为Size对象列表;否则,返回null。
这意味着,对于这些设备,相机的预览和视频输出是相同的,因此无论纵横比如何,设置不同的尺寸都会导致问题。
可以通过对相机预览尺寸(documentation for getSupportedVideoSizes
)和视频录制尺寸(Camera.Parameters#setPreviewSize)使用相同的尺寸来解决此问题。
但需要注意的是,并非所有使用相同预览和视频输出的设备都会遇到此问题。例如,HTC One Mini(Android 4.4.2)将动态更改其预览分辨率以匹配视频录制分辨率。虽然没有得到确认,但我的测试让我相信,使用SurfaceView
作为记录表面而不是使用TextureView
时,这是一个问题。在4.1之前,似乎接受了MediaRecorder#setVideoSize,所以ICS及以下你需要确保你的预览和视频大小匹配,但在JB +中,似乎并不重要。这可能与设备有很大关系,我还没有证实这个理论。
啊,是的,安卓的狂野世界!