根据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
,则视频录制可以工作。 最佳答案
显示出这个问题的设备似乎有一个共同点。调用Camera.Parameters#getSupportedVideoSizes()
all返回空值!根据documentation for getSupportedVideoSizes
,函数将返回:
退换商品
如果相机有单独的预览和视频输出,则返回大小对象列表;否则返回空值。
这意味着,对于这些设备,相机的预览和视频输出是相同的,因此设置不同的大小,无论纵横比,都会导致问题。
这可以通过对相机预览大小(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+中,这似乎无关紧要。这可能严重依赖于设备,我还没有证实这个理论。
啊,是的,Android的狂野世界!
关于android - 即使匹配“视频大小”和“预览大小”纵横比,MediaRecorder也会失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25536058/