gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:28 26 4
gpt4 key购买 nike

我有一个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 倍速播放?

最佳答案

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

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

此外,如果您使用该配置文件的原因是为了防止在使用 QUALITY_480P 时录制音频(因为时间流逝不录制音频),您可能需要调用 CamcorderProfile.get(QUALITY_480P) 并根据配置文件在MediaRecorder 上手动设置视频参数,无需直接调用MediaRecorder.setProfile。理论上,未设置任何音频参数的 MediaRecorder 不应录制任何音频。

关于Android MediaRecorder setCaptureRate()与视频播放速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16908300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com