FFmpeg的GOP(I帧)对齐问题

起因

DSAH视频系统(服务器&播放器)搭建中,当使用mp4dash对多个分辨率的视频进行切片时,遇到了一个错误:

Parsing media file 1: f1080p.mp4
Parsing media file 2: f720p.mp4
Parsing media file 3: f480p.mp4
Parsing media file 4: f360p.mp4
Parsing media file 5: f144p.mp4
WARNING: video duration mismatch between "File 2#1" and "File 1#1"
WARNING: video duration mismatch between "File 3#1" and "File 2#1"
ERROR: video tracks are not aligned ("File 2#1" differs from File 1#1)

提示不同分辨率的Video Track没有对齐。通过查阅资料,发现应该是GOP(I帧)不对齐的问题。


溯源

在之前的编码中,已经通过-g 48明确指定了GOP长度(48帧,即2s),具体命令为:

ffmpeg -i elephants_dream_1080p24.y4m -s 1920x1080 -c:v libx264 -g 48 -an ED1920x1080.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 1280x720 -c:v libx264 -g 48 -an ED1280x720.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 896x504 -c:v libx264 -g 48 -an ED896x504.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 640x360 -c:v libx264 -g 48 -an ED640x360.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 256x144 -c:v libx264 -g 48 -an ED256x144.mp4

为了验证,使用上述命令重新编码了5个分辨率的视频,输出分别为:
1920x1080
1280x720
896x504
640x360
256x144
留意各图中第二行的frame I,可以看出,各个Track的I帧数量确实是不同的。

明明已经指定了GOP长度,为什么会出现这种情况呢?这是因为编码器会根据场景切换自动添加I帧(确切来说是IDR帧)。我们知道,I帧是帧内预测编码,即根据本帧的图像信息独立编码,不需要依赖其他帧;而B、P帧为帧间预测,会根据本帧与其他帧间的变化进行编码。帧间预测在画面变动不大的情况下可以明显降低视频码率,但是如果遇到了大的场景切换,效果就会很差。因此,编码器为了编码后的视频质量考虑,默认会进行场景识别,从而在合适的地方自动添加I帧——这也就导致了不同分辨率Track下的I帧不对齐问题。


解决

既然知道了原因,解决思路就很明确了。只需要在使用ffmpeg进行编码的时候引入两个选项即可:

  • -keyint_min 48:keyint表示关键帧(IDR帧)间隔,这个选项表示限制IDR帧间隔最小为48帧,与之前设置的GOP等长
  • -sc_threshold 0:禁用场景识别,即禁止自动添加IDR帧

因此,保证GOP对齐的编码命令应该为:

ffmpeg -i elephants_dream_1080p24.y4m -s 1920x1080 -c:v libx264 -keyint_min 48 -g 48 -sc_threshold 0 -an ED1920x1080.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 1280x720 -c:v libx264 -keyint_min 48 -g 48 -sc_threshold 0 -an ED1280x720.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 896x504 -c:v libx264 -keyint_min 48 -g 48 -sc_threshold 0 -an ED896x504.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 640x360 -c:v libx264 -keyint_min 48 -g 48 -sc_threshold 0 -an ED640x360.mp4
ffmpeg -i elephants_dream_1080p24.y4m -s 256x144 -c:v libx264 -keyint_min 48 -g 48 -sc_threshold 0 -an ED256x144.mp4

*不过,强制IDR帧对齐可能会导致视频质量下降

更为详细的信息,参见:

猜你喜欢

转载自blog.csdn.net/LvGreat/article/details/103540007