在Android

时间:2015-11-27 06:46:46

标签: android android-camera mediacodec slowmotion

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

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

以下是我研究的内容:

我用MOTO X(具有内置慢动作视频录制功能)录制了慢动作视频,并使用 FFmpeg 检查其fps。我发现它的记录速度为110 fps(接近120fps),并以30fps的速度播放。这证明它为以高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来搜索solution。但我正在使用MediaCodec。

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

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

您要做的是修改时间戳。 MediaCodec支持VFR(可变帧速率)视频。而不是花费1秒钟记录60帧将以30fps回放,你可以每秒记录30帧,以15fps的速度回放。

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

如果你看一下“八部影片”电影是generated in Grafika的方式,你可以看到它与输出时间戳一起播放,使电影播放更慢或更快。

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

答案 1 :(得分:0)

用于慢速录制。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

用于高速录制。

mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);