1

我正在使用 Android 相机实现视频录制。我使用MediaCodec对来自 onPreviewFrame() 回调的帧进行编码。

现在我想录制慢动作视频。如何设置相机捕获率或帧率?我可以在哪里设置这些参数,例如,如果我想以 120 fps 录制并以 30 fps 播放?

以下是我研究过的:

我用 MOTO X(内置慢动作视频录制功能)录制了一段慢动作视频,并使用FFmpeg来检查它的 fps。我发现它以 110 fps(接近 120 fps)的速度录制并以 30 fps 的速度播放。这证明它为高帧率录制提供了硬件支持。

但是,当我使用getSupportedPreviewFpsRange检查其支持的 fps 范围时,只有 4 套支持的 fps 范围,没有一个大于 30fps:

min_fps: 15.0 , max_fps15.0

min_fps: 15.0 , max_fps20.0

min_fps: 15.0 , max_fps30.0

min_fps: 24.0 , max_fps30.0

我使用setPreviewFpsRange将 fps 设置得更高,但仍然不超过 30fps。我还尝试了设置MediaFormat的 KEY_FRAME_RATE 和 KEY_CAPTURE_RATE 。但它仍然不起作用。

我还通过使用 MediaRecorder 设置 CamcorderProfile 或 setVideoFrameRate 来搜索解决方案。但我正在使用 MediaCodec。

谁能帮我解决这个问题?

4

2 回答 2

2

以更高的速率捕获视频帧并不能解决问题。如果您以 120 fps 的速度拍摄并以 120 fps 的速度播放,则可以正常播放高速视频。

您要做的是修改时间戳。MediaCodec 支持 VFR(可变帧率)视频。与其花 1 秒记录 60 帧并以 30 fps 回放,不如您每秒记录 30 帧以 15 fps 回放。

MediaCodec 的 AVC 编码器生成的 H.264 流根本不包含时间戳。当您将输出提供给 MediaMuxer 时,您指定每个帧的时间戳,生成 .mp4 文件。大多数示例代码将简单地获取从 Camera 获得的时间戳,并通过 MediaCodec 将其传递给 MediaMuxer 而无需修改,但您可以对其进行调整。您唯一不能做的就是让时间戳倒退。

如果您查看在Grafika 中生成“八个矩形”电影的方式,您会发现它使用输出时间戳播放以使电影播放更慢或更快。

在不改变帧速率的情况下完成相同任务的另一种简单方法是将帧加倍。对于慢动作部分,只需将同一帧多次交给编码器即可。同样,您需要调整每一帧的演示时间戳,但您的视频将具有一致的 30fps。(如果你插入帧看起来会更好,但这要困难得多。)

于 2015-11-28T16:31:20.657 回答
0

用于慢速录制。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

用于高速记录。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);
于 2015-11-27T09:21:16.180 回答