我有一个 MediaRecorder 录制视频,我对setCaptureRate()的效果感到非常困惑。
具体来说,我准备我的 MediaRecorder 如下:
mMediaRecorder = new MediaRecorder();
mCamera.stopPreview();
mCamera.unlock();
mMediaRecorder.setCamera(mCamera);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mMediaRecorder.setProfile(CamcorderProfile.QUALITY_TIME_LAPSE_480P);
mMediaRecorder.setCaptureRate(30f);
mMediaRecorder.setOrientationHint(270);
mMediaRecorder.setOutputFile(...);
mMediaRecorder.setPreviewDisplay(...);
mMediaRecorder.prepare();
我记录了五秒钟(使用 CountDownTimer,但这无关紧要),这是生成的文件:
$ ffmpeg -i ~/CaptureRate30fps.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 30.00 (30/1)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/CaptureRate30fps.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:52:00
Duration: 00:00:02.59, start: 0.000000, bitrate: 5238 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 5235 kb/s, PAR 65536:65536 DAR 3:2, 30 fps, 30 tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:52:00
请注意,持续时间约为 3 秒。视频的播放速度也快了很多,仿佛将 5 秒的视频塞进了 3 秒。
现在,如果我通过完全按照上面的方式准备 mediaRecorder 进行录制,但减去 setCaptureRate(30f) 行,我会得到一个像这样的文件:
$ ffmpeg -i ~/NoSetCaptureRate.mp4
...
Seems stream 0 codec frame rate differs from container frame rate: 180000.00 (180000/1) -> 90000.00 (180000/2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/home/mspitz/NoSetCaptureRate.mp4':
Metadata:
major_brand : isom
minor_version : 0
compatible_brands: isom3gp4
creation_time : 2013-06-04 00:50:41
Duration: 00:00:04.87, start: 0.000000, bitrate: 2803 kb/s
Stream #0.0(eng): Video: h264 (Baseline), yuv420p, 720x480, 2801 kb/s, PAR 65536:65536 DAR 3:2, 16.01 fps, 90k tbr, 90k tbn, 180k tbc
Metadata:
creation_time : 2013-06-04 00:50:41
请注意,持续时间与预期的一样,约为 5 秒。视频也以正常速度播放。
我使用 setCaptureRate(30f) 因为每秒 30 帧是我的 CamcorderProfile 的videoFrameRate的值。在我的 Galaxy Nexus S2 (4.2.1) 上,省略 setCaptureRate() 很好,但是当我在 Galaxy Nexus S3 (4.1.1) 上测试时,省略 setCaptureRate() 会导致非常有用的“启动失败 -22”错误当我打电话时mMediaRecorder.start()
。
那么,我错过了什么?我认为捕获率和视频帧率是独立的,但很明显它们不是。有没有办法以编程方式确定我需要设置什么捕获速率才能确定我的视频以 1 倍速度播放?