【问题标题】:Recording slow motion video using MediaCodec on Android在 Android 上使用 MediaCodec 录制慢动作视频
【发布时间】:2016-03-01 07:37:59
【问题描述】:

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

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

以下是我研究过的:

我用 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 搜索了 solution。但我正在使用 MediaCodec。

谁能帮我解决这个问题?

【问题讨论】:

    标签: android android-camera android-mediacodec slowmotion


    【解决方案1】:

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

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

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

    如果您查看“8 rects”电影的方式为generated in Grafika,您可以看到它使用输出时间戳播放以使电影播放更慢或更快。

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

    【讨论】:

    • 感谢您的回答!但我认为以 15fps 播放的视频可能会滞后。如果以 60fps 或更高的速度拍摄视频,并以 30fps 的速度播放似乎是一个更好的选择。我真的想知道是否有任何方法可以真正以更高的帧速率录制视频?
    • @ZebinXu:这是由视频源(即摄像头)决定的,而不是 MediaCodec。要获得 30fps 的慢动作,您需要告诉相机将帧捕获率提高一倍,同时修改提供给 MediaMuxer 的时间戳。 MediaCodec 对帧计时的唯一兴趣是尝试将流比特率限制为特定值时......如果你说你想要 8Mbps,它需要能够判断一秒钟内出现了多少帧,并且它可以使用帧时间戳来解决这个问题。
    • 好的,谢谢。但我的观点是,为什么我不能通过使用 API 或来自具有硬件高速捕获支持的设备的其他代码来捕获高速率视频?
    【解决方案2】:

    用于慢速录制。

    mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_LOW);

    用于高速录制。

    mMediaRecorder.setVideoFrameRate(QUALITY_HIGH_SPEED_HIGH);
    

    【讨论】:

    • 那是 MediaRecorder,不是 MediaCodec。
    • 感谢您的回答。你真的试过用它来录制慢动作视频吗?我确实尝试过使用 MediaRecorder。但是还是不行。
    • 您好,感谢您的回答,您知道已经以 120 fps 速率拍摄的安卓相机应用程序(第三方)吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2015-12-24
    相关资源
    最近更新 更多