一、影响DVD画质的关键
DVD格式已经决定了分辨率是有最大上限的,因此PAL的720*576分辨率稍稍优于NTSC的720*480分辨率。而帧率对画质的影响可以说微乎其微。因此真的要压榨出DVD的极限画质,PAL制式是好于NTSC的。但是,如果你的源视频帧率是29.98或者30帧,如果强制转换为25帧,则会出现丢帧现象,这将导致视频流畅度出现问题,此时使用NTSC制式是要优于强制使用PAL制式的。同样,使用PAL制式面对23.98帧或者24帧这样的视频,如果进行帧率转换,同样会出现帧复制现象,导致视频流畅度出现问题,我推荐的做法是稍微加速帧间隔时间(既缩短每帧的存在时间,将视频加快到25FPS速度进行播放),同时按相同速度加速音频,实测,23.98FPS视频加速到25FPS,差异几乎不可察觉。FFMPEG下将23.98FPS变为25FPS,方法如下(24到25,29.98到30同理):
加入视频滤镜参数:
-vf "setpts=PTS*24000/1001/25"
加入音频滤镜参数:
-af "atempo=25*1001/24000"
在视频编码参数处加入:
-r 25
至于交错编码,早应该进入历史的垃圾堆了,完全不用考虑!
最后,视频的最大码率对画质有着决定性影响!注意,最大码率并不是右击视频,属性里面的那个码率,那个码率只是整个视频的平均码率而已。因为DVD光盘介质的限制,DVD视频的最大码率在10.08Mbps,如果最大码率超过此值,会导致缓存欠载、解码单元过载等问题,最终结果就是播放卡顿。如果使用编码器限制最大码率,那么如果码率超过限制,编码器会大幅降低画质,最终结果就是画面瞬间出现马赛克、拖影、花屏甚至黑块,这对画质的打击是毁灭性的……所以如何提高编码压缩效率,让最大码率不要超过限制,是挖掘DVD极限画质的关键。
二、关键帧(I帧)
不知道为什么,FFMPEG的MPEG-2(Main)编码器似乎不支持根据视频场景变化幅度自动插入I帧,而是默认每间隔12帧插入一帧关键帧,这在压制动画片类视频时,将毁灭性的降低编码效率。粗暴的解决方法是手动规定GOP的大小,强制编码器按照你设置的大小间隔插入关键帧,FFMPEG实现方法如下:
视频编码参数处加入:
-g 125
我拿一段动画面做了不同GOP大小下,对最大码率影响的测试,结果如下:

↑GOP 默认

↑GOP 32

↑GOP 64

↑GOP 128
可见,GOP越大(既关键帧间隔越大),编码效率越高,但是编码效率与GOP大小并不是线性对应的,随着GOP增大,编码效率提高的幅度快速的缩小。并且随着GOP增大,视频的快进快退以及拖动时间轴将会出现严重的卡顿(因为以上功能都需要使用I帧作为导航),并且一旦某个I帧损坏,那么这整个GOP的画面都无法解码,就是说PAL制式下,GOP设置125,那么一个I帧损坏,将导致后续5秒的时间内画面异常。所以要设置多大完全看你的源视频和你有多狠了……
我推荐的做法则是通过变通的方法来实现根据视频场景变化幅度自动插入I帧,原理很简单,先将源视频转码为支持自动插I帧的格式,然后再编码为MPEG2格式时要求编码器继承I帧,FFMPEG实现方法如下:
经过大量测评,中间格式使用X264,且使用如下方法时效果最佳,在视频编码参数处加入:
-profile:v high -level:v auto -preset:v ultrafast -tune:v none -sc_threshold 80
编码MPEG2时,在视频编码参数处加入:
-force_key_frames source -g 125
如下是使用默认参数以及自动插I帧的测试:
↑默认

↑自动
在动画片中效果如何不用我说了吧……
三、双向参考帧(B帧)
其实早在VCD格式时,就支持B帧了,但是不知道为什么,FFMPEG在编码MPEG2(Main)时并不会启用B帧,但我们可以手动开启B帧,在FFMPEG里方法如下:
在视频编码参数处加入:
-bf 1
那插入多少个B帧合适呢?评测如下:

↑无B帧

↑一B帧

↑两B帧

↑三B帧
是不是很让人意外,只插入一个B帧效率是最高的……我高度怀疑是因为MPEG-2编码技术实在是太老了,老话说得好:贫穷限制了我的想象……
四、模糊滤镜
通过牺牲画面明暗(即细节)大幅加强编码效率(即减小最大码率),效果是立竿见影的,画面糊一点总比满屏的马赛克拖影强吧……要是播放器足够给力,你甚至可以回放时再给锐化回来,哈哈……FFMPEG里实现方法如下:
加入视频滤镜参数:
-vf "unsharp=5:5:-1.00:5:5:0.0"

↑无处理

↑锐化0.5

↑模糊0.5

↑模糊1.0
做了一个梯度测试,从锐化0.5到模糊1.0,可见最大码率几乎和模糊程度呈线性正相关,虽然模糊能够大幅降低最大码率,但是是以损失细节为代价,并且是一眼的差距,所以我的建议是除非迫不得已,否则不要上,非要上最大-1.00程度,不然那效果,不信自己转码一个看看……另外就是,如果发现自己转码的视频最大码率上不去,那么你就可以搞一下锐化,画质总归是有变化的,比用FFMPEG强制最低码率搞出来的虚假高码率是要实在的多。
五、饱和度
既然牺牲画面明暗能减小最大码率,自然也能缩水画面色度来减小最大码率,不过传统的YUV4:2:0结构来看,明度信息大小倍数于色度信息,自然缩饱和度减小最大码率的效果理论上是远小于使用模糊滤镜的,FFMPEG里实现饱和度改变的方法如下:
加入视频滤镜参数:
-vf "hue=0:0.75"

↑无处理

↑饱和度70%

↑饱和度80%

↑饱和度90%
做了一个梯度测试,额……效果嘛聊胜于无吧,发现饱和度降低为原来的75%,是最稳定的。不过降低饱和度后,在回放时可以简单的通过播放器调节饱和度到1.3来大部分补偿回来,也算贼不走空吧……同样的,如果发现自己转码的最大码率上不去,你可以稍微调大一点饱和度,效果也是有的,但不要太过分,过饱和的画面比马赛克还让人抓狂……
DVD格式已经决定了分辨率是有最大上限的,因此PAL的720*576分辨率稍稍优于NTSC的720*480分辨率。而帧率对画质的影响可以说微乎其微。因此真的要压榨出DVD的极限画质,PAL制式是好于NTSC的。但是,如果你的源视频帧率是29.98或者30帧,如果强制转换为25帧,则会出现丢帧现象,这将导致视频流畅度出现问题,此时使用NTSC制式是要优于强制使用PAL制式的。同样,使用PAL制式面对23.98帧或者24帧这样的视频,如果进行帧率转换,同样会出现帧复制现象,导致视频流畅度出现问题,我推荐的做法是稍微加速帧间隔时间(既缩短每帧的存在时间,将视频加快到25FPS速度进行播放),同时按相同速度加速音频,实测,23.98FPS视频加速到25FPS,差异几乎不可察觉。FFMPEG下将23.98FPS变为25FPS,方法如下(24到25,29.98到30同理):
加入视频滤镜参数:
-vf "setpts=PTS*24000/1001/25"
加入音频滤镜参数:
-af "atempo=25*1001/24000"
在视频编码参数处加入:
-r 25
至于交错编码,早应该进入历史的垃圾堆了,完全不用考虑!
最后,视频的最大码率对画质有着决定性影响!注意,最大码率并不是右击视频,属性里面的那个码率,那个码率只是整个视频的平均码率而已。因为DVD光盘介质的限制,DVD视频的最大码率在10.08Mbps,如果最大码率超过此值,会导致缓存欠载、解码单元过载等问题,最终结果就是播放卡顿。如果使用编码器限制最大码率,那么如果码率超过限制,编码器会大幅降低画质,最终结果就是画面瞬间出现马赛克、拖影、花屏甚至黑块,这对画质的打击是毁灭性的……所以如何提高编码压缩效率,让最大码率不要超过限制,是挖掘DVD极限画质的关键。
二、关键帧(I帧)
不知道为什么,FFMPEG的MPEG-2(Main)编码器似乎不支持根据视频场景变化幅度自动插入I帧,而是默认每间隔12帧插入一帧关键帧,这在压制动画片类视频时,将毁灭性的降低编码效率。粗暴的解决方法是手动规定GOP的大小,强制编码器按照你设置的大小间隔插入关键帧,FFMPEG实现方法如下:
视频编码参数处加入:
-g 125
我拿一段动画面做了不同GOP大小下,对最大码率影响的测试,结果如下:

↑GOP 默认

↑GOP 32

↑GOP 64

↑GOP 128
可见,GOP越大(既关键帧间隔越大),编码效率越高,但是编码效率与GOP大小并不是线性对应的,随着GOP增大,编码效率提高的幅度快速的缩小。并且随着GOP增大,视频的快进快退以及拖动时间轴将会出现严重的卡顿(因为以上功能都需要使用I帧作为导航),并且一旦某个I帧损坏,那么这整个GOP的画面都无法解码,就是说PAL制式下,GOP设置125,那么一个I帧损坏,将导致后续5秒的时间内画面异常。所以要设置多大完全看你的源视频和你有多狠了……
我推荐的做法则是通过变通的方法来实现根据视频场景变化幅度自动插入I帧,原理很简单,先将源视频转码为支持自动插I帧的格式,然后再编码为MPEG2格式时要求编码器继承I帧,FFMPEG实现方法如下:
经过大量测评,中间格式使用X264,且使用如下方法时效果最佳,在视频编码参数处加入:
-profile:v high -level:v auto -preset:v ultrafast -tune:v none -sc_threshold 80
编码MPEG2时,在视频编码参数处加入:
-force_key_frames source -g 125
如下是使用默认参数以及自动插I帧的测试:

↑默认

↑自动
在动画片中效果如何不用我说了吧……
三、双向参考帧(B帧)
其实早在VCD格式时,就支持B帧了,但是不知道为什么,FFMPEG在编码MPEG2(Main)时并不会启用B帧,但我们可以手动开启B帧,在FFMPEG里方法如下:
在视频编码参数处加入:
-bf 1
那插入多少个B帧合适呢?评测如下:

↑无B帧

↑一B帧

↑两B帧

↑三B帧
是不是很让人意外,只插入一个B帧效率是最高的……我高度怀疑是因为MPEG-2编码技术实在是太老了,老话说得好:贫穷限制了我的想象……
四、模糊滤镜
通过牺牲画面明暗(即细节)大幅加强编码效率(即减小最大码率),效果是立竿见影的,画面糊一点总比满屏的马赛克拖影强吧……要是播放器足够给力,你甚至可以回放时再给锐化回来,哈哈……FFMPEG里实现方法如下:
加入视频滤镜参数:
-vf "unsharp=5:5:-1.00:5:5:0.0"

↑无处理

↑锐化0.5

↑模糊0.5

↑模糊1.0
做了一个梯度测试,从锐化0.5到模糊1.0,可见最大码率几乎和模糊程度呈线性正相关,虽然模糊能够大幅降低最大码率,但是是以损失细节为代价,并且是一眼的差距,所以我的建议是除非迫不得已,否则不要上,非要上最大-1.00程度,不然那效果,不信自己转码一个看看……另外就是,如果发现自己转码的视频最大码率上不去,那么你就可以搞一下锐化,画质总归是有变化的,比用FFMPEG强制最低码率搞出来的虚假高码率是要实在的多。
五、饱和度
既然牺牲画面明暗能减小最大码率,自然也能缩水画面色度来减小最大码率,不过传统的YUV4:2:0结构来看,明度信息大小倍数于色度信息,自然缩饱和度减小最大码率的效果理论上是远小于使用模糊滤镜的,FFMPEG里实现饱和度改变的方法如下:
加入视频滤镜参数:
-vf "hue=0:0.75"

↑无处理

↑饱和度70%

↑饱和度80%

↑饱和度90%
做了一个梯度测试,额……效果嘛聊胜于无吧,发现饱和度降低为原来的75%,是最稳定的。不过降低饱和度后,在回放时可以简单的通过播放器调节饱和度到1.3来大部分补偿回来,也算贼不走空吧……同样的,如果发现自己转码的最大码率上不去,你可以稍微调大一点饱和度,效果也是有的,但不要太过分,过饱和的画面比马赛克还让人抓狂……
