我正在制作一个介入ffmpeg的write_frame函数并将输出数据写入单独文件的分段器。每个分段文件包含大约3秒视频的片段。
代码确实如下:
1 - Get transcoded packet
2 - Check if it contains key frame data, if yes goto 3.
3 - Check the duration of current segment, if it exceed 3 seconds, goto 4
4 - Close file, and create new segment, write packet to segment file, goto-1
一般来说,每个片段包含至少3秒的视频数据,并以关键帧开头。
问题是输出视频的持续时间非常不同,有些包含3秒,有些包含5或6。
我怀疑问题是由于ffmpeg在转码过程中如何生成关键帧。如果两个相邻关键帧之间的“距离”为6s,则我得到6秒的段。
以下是我的问题:
是不是ffmpeg以不规则的间隔生成关键帧(间隔时间可以达到几秒钟(例如6))?
我们如何控制ffmpeg关键帧的生成? (我想应该有一个ffmpeg命令的参数,可能是-force_key_frames,但我不确定)
答案 0 :(得分:11)
ffmpeg可以根据场景变化检测以不规则的间隔生成关键帧。
关键帧间隔可以通过GOP大小控制。可以使用以下选项
-g(FFmpeg) 关键帧间隔,也称为GOP长度。这决定了I帧之间的最大距离。非常高的GOP长度将导致稍微更高效的压缩,但会使视频中的搜索更加困难。
-keyint_min(FFmpeg) 最小GOP长度,I帧之间的最小距离。