如何控制ffmpeg的关键帧生成?

时间:2013-01-02 06:27:09

标签: ffmpeg libav

我正在制作一个介入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秒的段。

以下是我的问题:

  1. 是不是ffmpeg以不规则的间隔生成关键帧(间隔时间可以达到几秒钟(例如6))?

  2. 我们如何控制ffmpeg关键帧的生成? (我想应该有一个ffmpeg命令的参数,可能是-force_key_frames,但我不确定)

1 个答案:

答案 0 :(得分:11)

  1. ffmpeg可以根据场景变化检测以不规则的间隔生成关键帧。

  2. 关键帧间隔可以通过GOP大小控制。可以使用以下选项

  3. -g(FFmpeg) 关键帧间隔,也称为GOP长度。这决定了I帧之间的最大距离。非常高的GOP长度将导致稍微更高效的压缩,但会使视频中的搜索更加困难。

    -keyint_min(FFmpeg) 最小GOP长度,I帧之间的最小距离。