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

标签 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在转码过程中如何生成关键帧造成的。如果两个相邻关键帧之间的“距离”是 6 秒,则我得到 6 秒的片段。

这是我的问题:

  1. ffmpeg 以不规则的间隔生成关键帧(间隔时间最多可达几秒(例如 6 秒)),这是真的吗?

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

最佳答案

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

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

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

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

关于ffmpeg - 如何控制ffmpeg关键帧的生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14117757/

相关文章:

c - 如何快速获得任何音频文件的准确持续时间?

部分视频中的ffmpeg循环声音

nginx - 用于视频流平台的开源 CMS 和服务器

ffmpeg - 是否可以在文本文件中而不是在命令行中向 FFmpeg 提供输入文件列表?

c++ - 如何旋转 AVFrame?

ffmpeg - 正确的 AVFrame RGB 值

ffmpeg - RTSP流的轻量级编码方法?

ffmpeg - 使用 libx264 压缩一组图像时,为什么帧速率会影响最终输出大小?

c++ - libav 实时转码为 SFML SoundStream,乱码和噪音

ffmpeg - avcodec_find_decoder(CODEC_ID_MPEG2TS) 始终为 NULL