我有一个使用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
返回的支持帧率范围是10,000-30,000,因此我选择10,000以获得最低的录制分辨率(10FPS)。
我选择S5提供的最低分辨率,即176(宽)x 144(高)(以保持较低的视频文件大小),然后进行以下MediaRecorder设置......
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();
。
此代码适用于“Sony XPeria”,“HTC One”,“HTC One V”,“Samsung Galaxy S3”和“HTC Explorer”以及其他一些设备,运行各种Android版本姜饼到KitKat(我无法在Gingerbread上获得单独的视频大小列表)。
只有三星Galaxy S5在176 x 144录制时出现问题。调用mMediaRecorder.start();
时,录制无法以“java.lang.RuntimeException:start failed”开头。异常。
我无法解决问题所在。所有其他录制分辨率(增加的EncodingBitRate设置)工作得很好 - 它只有176 x 144在S5上不起作用。
还有其他人看过这个问题吗?有人知道S5是否有问题导致录制停止在支持的最低视频分辨率下正常工作?或者是否有一些我错过的三星'技巧'?
任何帮助或见解都会非常感激 - 我正在撕掉我的头发!
答案 0 :(得分:2)
我发现问题是由于帧速率而不是分辨率造成的。 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的帧速率,这不太理想 - 感谢三星!
最后,是否有人知道如何/在哪里向三星报告此错误?
答案 1 :(得分:0)
这篇文章(Android can't record video with Front Facing Camera, MediaRecorder start failed: -19)对这一特定问题有了更多的了解,而这一切似乎都指向了相机API有点勉强!因为'解决' S5的这个问题,我发现与Sony XPeria Z完全相同的问题。尽管Camera.getParameters()。getSupportedPreviewFpsRange()返回,这些手机实际上只支持15/24 / 30fps(S5 )和15 / 30fps(Xperia Z)通过mMediaRecorder.setVideoFrameRate()进行实际的MediaRecorder视频录制。
也许这里的线索是"预览"在方法名称getSupportedPreviewFpsRange()中,返回的值仅适用于预览表面。也许这些手机的三星和索尼开发人员过于字面地使用了这个方法名称,只返回预览fps值,让开发人员猜测视频帧率;我发现很难以找出MediaRecorder视频录制所支持的FPS值的方式。
大多数手机似乎都替代了“好”的手机。 setVideoFrameRate()的值,如果不支持提供的值,从而保护开发人员不必猜测支持的速率是多少。 S5和Z(以及可能是其他人)只是盲目地采取setVideoFrameRate()中设置的任何值,然后如果您选择的值不被支持,则有助于崩溃-19错误。正如@Madhava Jay在他的帖子中指出的那样#34;我没有看到任何方式来确定[帧速率]而不仅仅是猜测"。
可能是相机可以支持一系列帧速率,但索尼和三星对MediaRecorder的实施不足以无法接受这些费率。
最重要的东西Android!