如何强制第一帧为关键帧?

jac*_*ode 2 ffmpeg

我想在寻找到某个位置后进行编码,并且我想让第一帧成为关键帧,这里我使用的命令是:

ffmpeg -ss 300  -i howimet.mp4 -acodec libfaac -ar 48000 -ab 128k -ac 2  -vcodec libx264 -vf "scale=480:270" -f mpegts -force_key_frames 300 -t 120 howimet2.ts
Run Code Online (Sandbox Code Playgroud)

-force_key_frames 设置为寻找位置以在那里制作关键帧。我使用以下脚本(来自此处)来检查第一帧是否是关键帧

ffprobe -show_frames -v quiet howimet2.ts | awk -F= '   /pict_type=/ { if (index($2, "I")) { i=1; } else { i=0; } } 
  /pkt_pts_time/ { if (i && ($2 >= 0)) print $2; }  
' | head -n 1
Run Code Online (Sandbox Code Playgroud)

结果显示第一个关键帧不在第二个 0 处。

我想我的命令不正确。我错过了什么?

slh*_*hck 5

当编码视频,所述第一框架具有成为一个关键帧。它将是第一个完全编码的,后续帧可能会使用它进行帧间预测。此外,在编码视频序列的开头,您将拥有一个 H.264 访问单元,它告诉解码器进行刷新。

因此,无论您在做什么:除非您只是复制比特流,否则您正在重新编码视频,并且您的第一帧必须是关键帧。

现在,无论出于何种原因,您的流在其开始时间都有一个偏移量。这意味着所有演示时间戳也根据此偏移量进行移位。如果您检查ffprobe -show_frames输出的头部,您会看到第 0 帧确实是一个关键帧,但具有不同的 PTS。

为了弥补这一点,您可以从所有 PTS 中减去开始时间。