我正在使用Android摄像头实现视频录制。我使用MediaCodec对onPreviewFrame()回调中的帧进行编码。
现在我想录制慢动作视频。如何设置摄像机的捕获速率或帧速率?在哪里可以设置这些参数,例如,如果我想以120 fps录制,以30 fps播放?
以下是我所研究的:
我用MOTO X(内置慢动作视频录制功能)录制了一段慢动作视频,用FFmpeg查看了它的fps,发现它的录制速度是110 fps(接近120 fps),回放速度是30 fps,这证明它为高fps录制提供了硬件支持。
但是,当我使用getSupportedPreviewFpsRange检查其支持的fps范围时,只有4组支持的fps范围,没有一组大于30 fps:
最小帧/秒:15.0,最大帧/秒15.0
最小帧/秒:15.0,最大帧/秒20.0
最小fps:15.0,最大fps:30.0
最小fps:24.0,最大fps:30.0
我使用setPreviewFpsRange将fps设置得更高,但它仍然不超过30 fps。我还尝试设置MediaFormat的KEY_FRAME_RATE和KEY_CAPTURE_RATE。但它仍然不起作用。
我也用MediaRecorder设置了CamcorderProfile或者setVideoFrameRate来搜索solution,但是我用的是MediaCodec。
有人能帮我解决这个问题吗?
3条答案
按热度按时间zed5wv101#
以更高的速率捕获视频帧并不能解决这个问题。如果以120fps的速率捕获,然后以120fps的速率回放,则会以正常速率播放高速视频。
MediaCodec支持VFR(可变帧速率)视频,您可以录制每秒30帧的视频,并以15fps的速率播放,而不是用1秒的时间录制60帧,以30fps的速率播放。
由MediaCodec的AVC编码器生成的H.264流根本不包含时间戳。当您将输出提供给MediaMuxer时,您可以为每个帧指定时间戳,从而生成.mp4文件。大多数示例代码将简单地获取从Camera获得的时间戳,并将其通过MediaCodec传递给MediaMuxer,而无需修改。但允许您对其进行调整,唯一不能做的是允许时间戳向后移动。
如果您查看“八个rects”影片的generated in Grafika方式,您可以看到它使用输出时间戳播放,以使影片播放得更慢或更快。
另一个不改变帧速率就能完成同样任务的简单方法是将帧增加一倍。对于慢动作部分,只需将同一帧多次交给编码器。同样,您需要调整每一帧的演示时间戳,但您的视频将具有一致的30fps。(如果您插入帧,看起来会更好,但这要困难得多。)
jv4diomz2#
用于慢速录制。
设置视频帧速率(质量_高_速度_低);
用于高速记录。
d6kp6zgx3#
我认为这个问题包含两个不同的问题。
1.如何激活比60 FPS更快的高速捕捉模式?
1.如何降低
MediaCodec
编码器生成的FPS?第二部分很简单。如this answer中所述,您可以插入插值/虚拟帧,或者修改时间戳。第一部分的特殊之处在于,大多数示例代码处理的是 * 普通模式 * 的捕获,而不是本用例所需的 * 高速 * 捕获(通常高于60 FPS,一般来说,我们处理的是120~ 240 FPS)。
关于问题的第一部分,我想让你看一下关于Camera 2约束的高速捕获API的描述,比如this。不幸的是,似乎只有利基市场对这样的API有需求,我无法收集到关于我自己的发现的很多信息,我目前正在处理自己的脑力负荷项目,自己创建一个样本代码。然而,从它与普通电影录制和burst shots的相似性来判断,我不认为导出这样一个用例会那么复杂。