引言
在编码10bit视频时用10bit进行编码会比8bit编码获得更好的质量,这个比较容易理解:使用8bit编码需要首先对原始信号进行缩放,编码后还需要缩放,缩放就会造成更多的失真。换句话说,压缩会比直接缩放带来更小的失真。因此使用10bit编码器压缩10bit视频会节省带宽。
然而,实际上,即使是8bit视频,采用10bit进行编码依然会比8bit编码节省带宽。即10bit始终比8bit节省带宽,与原始像素的bitdepth无关。
具体原因
接下来从以下五点进行解释:
什么是节省带宽
节省带宽意味着同样的视频质量,需要的bitrate更低,可以通过BD-rate来体现
什么是较好的视频质量
视频质量好即解码图像与原始图像之间的相似性高,误差小。
这一点值得注意,8bit中的1位误差与10bit中的3位误差具相同的相对误差。
可以想象,像素值为0-255时,像素值由1编为2,与像素值为0-1023时,像素值由1编为5,是不是感觉差不多的。相当于人眼的精度只能分辨1/256的变化(假设)。
更直接的方法可以用psnr的计算公式来证明:
8bit时, p s n r _ 8 b i t = 10 l o g 10 ( 255 ∗ 255 / m s e _ 8 b i t ) psnr\_8bit=10log10(255*255/mse\_8bit) psnr_8bit=10log10(255∗255/mse_8bit)
而10bit10, p s n r _ 10 b i t = 10 l o g 10 ( 1023 ∗ 1023 / m s e _ 10 b i t ) psnr\_10bit=10log10(1023*1023/mse\_10bit) psnr_10bit=10log10(1023∗1023/mse_10bit)
令, p s n r _ 8 b i t = p s n r _ 10 b i t psnr\_8bit=psnr\_10bit psnr_8bit=psnr_10bit
得, 16 ∗ m s e _ 8 b i t = m s e _ 10 b i t 16*mse\_8bit=mse\_10bit 16∗mse_8bit=mse_10bit
假设只有一个像素,原始像素值为 p _ s r c p\_src p_src,重建像素值为 p _ d e c p\_dec p_dec
则有4 * (p_dec_8bit – p_src) = p_dec_10bit – p_src
所以懂了吧,10bit的误差可以是8bit的4倍,但是可以获得相同的PSNR
压缩过程中的失真是如何产生的
视频压缩过程中,主要产生失真的过程是量化。
量化可以简单理解为变换系数除以量化步长。
量化后的值再经过反量化得到的变换系数就与量化前的系数产生了误差。
因为量化是多对一的过程,多个变换系数会被量化成一个值,而反量化是一对一的过程,因此没办法完全恢复,所以就有了失真。
编码器如何编码10bit视频
上面说过,因为失真是相对的,所赛车每天赚1000的方法 r _ 8 b i t = p s n r _ 10 b i t psnr\_8bit=psnr\_10bit psnr_8bit=psnr_10bit
得, 16 ∗ m s e _ 8 b i t = m s e _ 10 b i t 16*mse\_8bit=mse\_10bit 16∗mse_8bit=mse_10bit
假设只有一个像素,原始像素值为 p _ s r c p\_src p_src,重建像素值为 p _ d e c p\_dec p_dec
则有4 * (p_dec_8bit – p_src) = p_dec_10bit – p_src
所以懂了吧,10bit的误差可以是8bit的4倍,但是可以获得相同的PSNR
压缩过程中的失真是如何产生的
视频压缩过程中,主要产生失真的过程是量化。
量化可以简单理解为变换系数除以量化步长。
量化后的值再经过反量化得到的变换系数就与量化前的系数产生了误差。
因为量化是多对一的过程,多个变换系数会被量化成一个值,而反量化是一对一的过程,因此没办法完全恢复,所以就有了失真。
编码器如何编码10bit视频
上面说过,因为失真是相对的,所以10bit可以用4倍于8bit的量化步长而获得同样的相对失真,即PSNR。
而由于10bit用的量化步长是8bit的4倍,他们最终的量化等级数就都是一样的,也就是最终的比特数都是一样的。
比如8bit的量化步长如果是8的话,那0-255会被量化成32个等级,而10bit的量化步长就可以用32,最终也是32个量化等级。
相当于量化系数都是0-31,再熵编码是不是比特数也一样了呢。
照这样说,那10bit的编码结果应该和8bit完全一样呀,为什么会更好呢,我们接着往下说.
为什么10bit编码器要优于8bit编码器
当编码器使用10bit编码时,相比8bit有更少的阶段误差,尤其是运动补偿阶段,因此会增加压缩效率。
总的来说就是会在某些地方比8bit更好,所以最终才会节省带宽。