在为DASH回放调节流时,所有流中的随机访问点必须位于完全相同的源流时间。这样做的通常方法是强制使用固定的帧速率和固定的GOP长度(即每N帧使用一个关键帧)。
在FFmpeg中,固定帧速率很容易(-r NUMBER)。
但是对于固定的关键帧位置(GOP长度),有三种方法...哪种是“正确的”?FFmpeg文档对此非常含糊。
方法1:弄乱libx264的参数
-c:v libx264 -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE:scenecut=-1
是否应该关闭或关闭场景切换似乎引起了一些争论,因为不清楚在场景切换发生时是否重新启动关键帧“计数器”。
方法2:设定固定的GOP大小:
-g GOP_LEN_IN_FRAMES
不幸的是,这仅是在FFMPEG文档中记录的,因此该论据的效果还不清楚。
方法3:每N秒插入一个关键帧(也许吗?):
-force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS)
这是明确记录的。但是,仍不清楚是否在每个关键帧之后都重新启动“计时器”。例如,在预期的5秒GOP中,如果scenecut
libx264在3秒内注入了一个关键帧,那么下一个关键帧是5秒后还是2秒后?
实际上,FFmpeg文档在此-g
选项和选项之间进行了区分,但并未真正说出上述两个选项之间的差异最小(显然,-g
这将需要固定的帧速率)。
哪个是对的?
似乎这-force_key_frames
将是更好的选择,因为它不需要固定的帧速率。但是,这要求
- 符合H.264中的GOP规范(如果有)
- 保证将有一个固定节奏的关键帧,而与libx264
scenecut
关键帧无关。
如果-g
不强制使用固定的帧速率(-r
),这似乎也行不通,因为无法保证ffmpeg
使用不同编解码器参数的多次运行将在每个分辨率中提供相同的瞬时帧速率。固定帧速率可能会降低压缩性能(在DASH方案中很重要!)。
最终,该keyint
方法似乎像个hack。我希望这不是正确的答案。
参考文献: