一、引言
笔者本人对音视频编码处理的基本概念基本上可以说是个白痴,在通过moviepy进行音视频处理时,发现帧数据就是一个大的numpy数组,很好奇这个数组的内容是什么,因此就到处找各种资料了解一些帧相关的基本概念,在这中间会发现“YUV”是个绕不过去的坎,但看了好多文章才理解这些相关概念的含义,在此写出来供各位与本人差不多的缺乏音视频基础知识的人士扫盲使用。
二、数字视频像素YUV编码格式
我们知道不同权重的R、G、B可以组成不同的颜色(又称为色调(hue)或色相,用于区别颜色的名称或种类,通常说的颜色七色即是指色调),但电视或视频的像素颜色表示不是使用的RGB来表示,而是使用的一种叫Y、U、V的维度来表示。
- Y表示亮度(Luminance或Luma),也称为灰阶值,是不同权重的R、G、B的组合值。实际上亮度是对颜色的明度(brightness)的一种度量,明度是指视觉系统对可见物体辐射或发光多少的感知属性,明度的一个极端是黑色没有光,另一个极端是白色,二者之间是灰色。明度很难度量,因此使用亮度(luminance)来度量,亮度(luminance)即辐射的能量。不同颜色的像素有不同的Y值,亮度信号可用来传送黑白图像,黑白视频只有Y(Luminance)视频,也就是灰阶值。
- UV色差信息:色彩信息可以表示为色差(Chrominance或Chroma),每一个色差表示了对应像素RGB值与Y的差,红色差=R-Y,蓝色差=B-Y。通过Y信息和色差信息就可以还原出RGB色彩信息。而UV信号(称为色度信号)是通过压缩红色差和蓝色差数值信号对视频频带高频端的色副载波进行调制而成的信号,经压缩后的蓝色差和红色差信号就称为U、V。UV信号告诉了显示器要偏移某象素的的颜色,而不改变其亮度。或者UV信号告诉了显示器使得某个颜色亮度依某个基准偏移。UV的值越高,代表该像素会有更饱和的颜色。
为什么色差信号能压缩呢?这是因为人类的视觉系统(HVS)对色度的敏感程度低于亮度,人眼对彩色细节的分辨能力远比对亮度细节的分辨能力低,这样就可以把几个相邻像素不同的彩色值当作相同的彩色值来处理,从而减少所需的存储容量和传输量。例如可以将相邻N个像素各自的Y值保留成N个不同的Y值,但它们可以共用一个相同的UV值,这种N+1的模式压缩了存储空间但还原RGB色彩后不影响人的感知。
不同的压缩方式对应不同的YUV编码格式,YUV细分的话有Y’UV,YUV,YCbCr,YPbPr等类型,这些YUV模型的区别主要在于UV数据的采样方式和存储方式。上述YUV编码类型中YCbCr主要用于数字信号,其中Y与YUV 中的Y含义一致, Cb , Cr 同样都指色彩, Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异,而Cb反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异,此即所谓的色差信号。一般所讲的YUV大多是指YCbCr。因此在数字图像处理中通常YUV指代YCbCr,JPEG、MPEG,H264均采用此格式。
YCbCr与RGB之间的换算公式如下:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -( 0.148 * R) - (0.291 * G) + (0.439 * B) + 128
与颜色相关的其他名词:
三、视频帧
我们知道数字视频播放是将一幅幅连续的静态图像按一定的频率快速切换所形成的图像流(可以称为视频流),这个播放频率即为fps(每秒播放的帧数),每个图像就称为视频的一个帧,在固定fps(帧率)播放速率情况下,在视频流中每个帧的位置可以通过时间作为位置来获取。
视频流存在两种形式,一种是没有基于流进行压缩的视频流,这种视频流是由YUV格式的图像组成,虽然YUV本身对应的帧有压缩但整个流没有压缩,这种流称为“原始流”或“YUV流”;另一种是基于流进行了压缩的视频流,称为“编码流”,又因为目前压缩/编码算法以H264为主,因此也常常称为“H264码流”。编码/压缩在流媒体领域是一项非常重要的技术:从“H264码流”到“YUV流”的过程称为解码,反之称为编码。对于视频编码/压缩而言,它的核心是采用尽量小的空间存储一组时间上连续的帧数据;而对于视频解码而言,就是把被编码/压缩后的一组帧数据尽量恢复成原来的样子,能够被100%恢复的编码/压缩算法称为无损压缩,反之称为有损压缩。
视频和帧相关的名词:
关于视频和帧的更多内容请参考《视频和视频帧:视频和帧基础知识整理》。
关于moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。
关于收费专栏
老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。
跟老猿学Python、学5G!