Android MediaRecorder setCaptureRate()和视频播放速度

spi*_*tor 5 android ffmpeg frame-rate video-capture mediarecorder

我有一个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();
Run Code Online (Sandbox Code Playgroud)

我记录了五秒钟(使用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
Run Code Online (Sandbox Code Playgroud)

请注意,持续时间仅为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
Run Code Online (Sandbox Code Playgroud)

请注意,持续时间是预期的,大约5秒.视频也以正常速度播放.

我正在使用setCaptureRate(30f)因为每秒30帧是我的CamcorderProfile的videoFrameRate的值.在我的Galaxy Nexus S2(4.2.1)上,省略setCaptureRate()很好,但是当我在Galaxy Nexus S3(4.1.1)上测试时,省略setCaptureRate()会导致无用的"start failed -2​​2"错误我打电话的时候mMediaRecorder.start().

那么,我错过了什么?我认为捕获率和视频帧速率是独立的,但很明显它们不是.有没有办法以编程方式确定我需要设置捕获率,以确定我的视频以1倍速度播放?

Rom*_*rik 2

(这是对原始问题的评论的决议摘要)

问题可能是直接使用QUALITY_TIME_LAPSE_480P配置文件会影响播放速率,因为时间流逝隐式不是 1x 播放速率。

此外,如果您使用该配置文件的原因是为了防止在使用时录制音频QUALITY_480P(因为延时不会录制音频),您可能需要根据配置文件手动调用CamcorderProfile.get(QUALITY_480P)和设置视频参数,而无需直接MediaRecorder打电话MediaRecorder.setProfileMediaRecorder理论上,没有设置任何音频参数的设备不应录制任何音频。