【错帖归档】B站视频压制参数需要调整——色彩范围在转码中的重要性
UnGrown
编辑于 2020年09月21日 12:12

(本文的动机、过程、结论均基于某播放软件的运行错误所带来的现象,故而文中所谓的“B站压制参数需要调整”是误论,原文标题和内容均保持原样归档,文中展示的部分参数可在其他场景下另有用途)

一切都始于昨晚“温习”av42250009,看了一眼收藏用的当初从作者网盘上拖下来的高码率原版1080P60,嫌体积大,想着用HEVC重新压一遍,又想到B站本身这个视频说不定也有HEVC流可以下载,就省得自己压了,于是拿自己魔改的you-get把这个视频的P2的1080P60格式拖了下来。

先看一看清晰度怎么样吧,再决定是否用这个来替换。嗯,怎么灰蒙蒙的?再打开原版观看,哇,这艳丽的色彩,这明亮的光照,这对比度真提神。可是B站压制版呢,灰蒙蒙的=低对比度,艳丽的色彩和明亮的光照都没了,一切都像隔了一层塑料纸在看。

这是作者传到网盘的原版截图,注意胸前这道炫目的光晕,以及肌肤上明暗界限处的亮度对比

这是B站压制的版本(无论AVC还是HEVC编码皆如此),对比度低了不少,不“炫”了

什么鬼!

大半夜的愣是提起了精神,强撑着睁不开的眼睛也要把前因后果弄明白。搜索引擎查阅资料,mediainfo视频元信息,ffmpeg压制试验……两个小时后总算大体上弄明白了怎么回事。

色彩范围!

简单说YUV的像素格式本身就不是0-255的全范围映射,YUV的亮度值范围是16-235、色彩分量这个范围则是16-240,无论如何,最黑的和最亮的部分不见了,所以对比度就降下来了。

所以色彩范围分两种,Full和Limited。Full就是0-255,艳丽明亮对比度高;Limited只有16-235,灰蒙蒙隔层塑料薄膜对比度低。

问题是Limited这玩意是技术发展的历史遗留问题,同时又是编码器默认参数,然后就不知不觉成了业内习惯,甚至成了某些人口中的“标准”本身(典型的因果倒置)。

其实对真人视频而言,Limited没啥问题,现实世界中也没什么高对比度的画面场景。

但是对CG动画就不一样了。av42250009就是一个典型的CG动画,高对比度,那些高对比的色彩和打光是这个视频的特色,一旦被压制成了Limited,对比度就被强行拉低了,那种视觉刺激感就没了。像这样的情况,需要用Full的色彩范围。

而实际上,完全可以一棍子把所有视频都按照Full的色彩范围来压制,这既不违反业界标准,也不会增加码率或者提高压制成本。

但是B站没有使用对应的参数。实际上,不止B站一家。实际上,不乏业界大厂同样如此。

所以说是业内习惯撒,很多人都无所谓……

那么,这样的色彩范围,要用什么方法得到呢?这个问题直到刚刚才想到去问谷歌,早知道应该早点问,因为啊,这一问就有:

https://stackoverflow.com/questions/47900346/ffmpeg-color-range-cropped-to-15-235-in-rgb

以ffmpeg的HEVC编码器举例,只要加上下面这些参数,就能保证压制出Full色彩范围的,和原片对比度一致的视频:

即使是yuv420的像素格式,也不用担心会被缩成0-235的Limited色彩范围。

关键的参数有两个(其实只有一个):

这是HEVC编码器的内部参数,指定色彩范围为full,但其实它指定的不是视频流中的真实像素的色彩范围,而是最后输出的视频文件里面的元信息,换句话说,这个参数是在输出文件里面打上一个标记,告诉播放软件,这个文件按照Full色彩范围来播放。

这个参数,才是核心,它是图像转换库libswscale的参数,它为1,会按照0-255的Full色彩空间范围输出实际画面像素,0则是Limited。

所以这两个参数都加,文件元信息里有色彩范围Full的标记,实际视频像素的色彩范围也是Full,播放器如果能够识别会遵循;如果只有dst_range,则视频文件元信息中会缺少色彩范围这一项,但是实际画面的像素已经是Full,播放器因为缺少元信息,无法判断色彩范围,很可能采用默认的Limited范围,但是播放出来的画面却是Full的,因为真实数据是Full范围的;如果只有前者,没有dst_range,那就只是空有元信息显示为Full色彩范围,但播放的画面色彩范围仍然是Limited。

所以B站只需要在现有的压缩流程中加上这两个(其实只有一个是关键)参数。

至于那些已经按照Limtied压制好了的视频,其实不用怕,可以把它们转换成Full的(当然免不了重新编码,重新编码就免不了多多少少会有画质损失,实在担心咱可以把画质适当过饱和地提高嘛)

还是用ffmpeg的HEVC编码器为例,将Limited色彩范围的视频转换成Full范围的视频,只需要加一个参数: