android - 即使匹配视频大小和预览大小纵横比,MediaRecorder 也会失败

标签 android video android-camera mediarecorder aspect-ratio

根据Camera.Parameters#getPreferredSizeForVideoPreview文档:

we recommend to choose a preview size that has the same aspect ratio as the resolution of video to be recorded

我发现,在某些设备 (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() 全部返回 null!根据documentation for getSupportedVideoSizes ,该函数将返回:

Returns
a list of Size object if camera has separate preview and video output; otherwise, null is returned.

这意味着,对于这些设备,相机的预览和视频输出是相同的,因此无论宽高比如何,设置不同的尺寸都会导致问题。

这可以通过对相机预览大小 (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/

相关文章:

Android 应用程序在单击菜单按钮时崩溃

android - 获取设备网络 url 调用

java - (Android Media Player) 为什么不能使用prepareAsync()而不是prepre()与AsyncTask

android - 语音识别连接错误

php - 清除缓存不适用于视频

video - 优化服务器上​​的视频存储/编码 (J2EE)

android - Google 的 Vision API 示例 Face Tracker Camera 权限

安卓相机 : Can not change flash mode from torch to other mode

java - MediaPlayer seekTo() 不更新 SurfaceView

android - 我可以在 WebView 中打开相机吗?