我有一个使用MediaRecorder录制视频的应用程序,我在三星Galaxy S5 SM-G900F上遇到了低分辨率录制的问题(只有这个设备-以最低支持的视频分辨率录制在我测试过的所有其他设备上都可以正常工作)。
我首先询问摄像机参数(使用camera parameters对象,所以mParameters.getSupportedVideoSizes();mParameters.getSupportedPreviewSizes();)以检查可用的录制和预览分辨率,s5分别返回以下支持的视频和预览大小:

Video Size List:        Preview Size List:
                        W = 1920,   H = 1080
W = 1920,   H = 1080    W = 1440,   H = 1080
W = 1440,   H = 1080    W = 1280,   H = 720
W = 1280,   H = 720     W = 1056,   H = 864
W = 800,    H = 450     W = 960,    H = 720
W = 800,    H = 480     W = 800,    H = 480
W = 720,    H = 480     W = 720,    H = 480
W = 640,    H = 480     W = 640,    H = 480
W = 352,    H = 288     W = 352,    H = 288
W = 320,    H = 240     W = 320,    H = 240
W = 176,    H = 144     W = 176,    H = 144

支持的帧速率范围是10000-30000,因此我选择10000作为最低记录分辨率(10fps)。
我选择了s5提供的最低分辨率,即176(宽)x 144(高)(以保持视频文件大小较低),然后进行以下媒体录制设置…
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setVideoFrameRate(10);
mMediaRecorder.setVideoSize(176, 144);
mMediaRecorder.setVideoEncodingBitRate(256000);
mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mMediaRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());   // Preview size is also set to 176 x 144
mMediaRecorder.setOutputFile(mVideoFilename);

…然后再调用mMediaRecorder.prepare();,然后再调用mMediaRecorder.start();
这段代码在“索尼Xperia”、“HTC One”、“HTC One V”、“三星Galaxy S3”和“HTC资源管理器”以及许多其他设备上运行良好,运行从姜饼到Kitkat的各种Android版本(我无法在姜饼上获得单独的视频大小列表)。
只有三星galaxy s5在176 x 144的录制上有问题。调用mMediaRecorder.start();时,录制无法以“java.lang.RuntimeException:start failed”异常开始。
我想不出问题在哪里。所有其他的录制分辨率(增加了编码比特率设置)工作得很好-只有176 x 144不能在s5上工作。
还有人看到这个问题吗?有人知道s5是否有问题,它会阻止录制以最低支持的视频分辨率正常工作吗?或者是我错过了三星的“把戏”?
任何帮助或见解都将非常感谢-我正在为这一个撕掉我的头发!

最佳答案

我发现问题出在帧速率上,而不是分辨率上。s5似乎在撒谎它支持的预览帧速率是多少。或者,更准确地说,getSupportedPreviewFpsRange()返回的值列表不是支持的帧速率的实际范围。
s5从getSupportedPreviewFpsRange()返回(10000,30000),根据文档,这是设备支持的视频帧速率范围,这意味着支持该范围内的任何帧速率(或者设备将尝试尽可能接近mMediaRecorder.setVideoFrameRate()中指定的速率)。
S5的想法不同!正如我所做的那样,将帧速率设置为10会阻止MediaRecorder启动视频录制,这是一个熟悉的MediaRecorder(22664): start failed: -19异常。
mMediaRecorder.setVideoFrameRate(10)调用中,我得到一个CameraSource(262): Requested frame rate (10) is not supported: 15,24,30异常,这意味着15、24和30是唯一支持的帧速率。如果我使用mMediaRecorder.setVideoFrameRate(20),我会得到同样的异常,但是如果我使用mMediaRecorder.setVideoFrameRate(30),它会工作得很好。
我还得到了一个OMX-VENC-720p(262): Invalid entry returned from get_supported_profile_level 2130706433, 65536异常,它似乎与mediaRecorder设置有关,但任何人都猜不到它的真正含义。
我不知道该如何知道15fps、24fps和30fps是唯一支持的帧速率。
如果有人知道我可以不被CameraSource(262): Requested frame rate (X) is not supported: 15,24,30异常绊倒而找出这个问题的方法,我很想知道它是什么。
我使用的方法已经被证明对几十种设备类型有效,包括三星S3,所以这个问题似乎是S5特有的。因此,我不得不通过首先确定应用程序运行在哪部手机上来强制设定一个s5特定的帧速率,这并不理想——谢谢三星!
最后,有人知道我如何/在哪里可以向三星报告这个错误吗?

关于android - 三星Galaxy S5不会以低分辨率/帧率录制视频,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28552207/

10-09 08:58