视频编解码器(Video Codec)
目录 |
视频编解码器是指一个能够对数字视频进行压缩或者解压缩的程序或者设备。通常这种压缩属于有损数据压缩。
音频和视频都需要可定制的压缩方法。人们尝试了很多种不同的办法来试图解决这个问题。一个复杂的平衡关系存在于以下因素之间:视频的质量、用来表示视频所需要的数据量(通常称之为码率)、编码算法和解码算法的复杂度、针对数据丢失和错误的鲁棒性(Robust-ness)、编辑的方便性、随机访问、编码算法设计的完美性、端到端的延时以及其它一些因素。
一个典型的数字视频编解码器的第一步是将摄像机输入的视频从RGB色度空间转换到YCbCr色度空间,而且通常还伴有色度抽样来生成4:2:0格式的视频(有时候在隔行扫描的情况下会采用4:2:2的抽样方式)。
转换到YCbCr色度空间会带来两点好处:
(1)部分地解除了色度信号中的相关性,提高了可压缩能力。
(2)将亮度信号分离出来,而亮度信号对视觉感觉是最重要的,相对来说色度信号对视觉感觉就不是那么重要,可以抽样到较低的分辨率(4:2:0或者4:2:2)而不影响人观看的感觉。
在真正的编码之前,对空域或者时域抽样可以有效地降低原始视频数据的数据量。
输入的视频图像通常被分割为宏块分别进行编码,宏块的大小通常是16x16的亮度块信息和对应的色度块信息。然后使用分块的运动补偿从已编码的帧对当前帧的数据进行预测。之后,使用块变换或者子带分解来减少空域的统计相关性。最常见的变换是8×8的DCT(DiscreteCosineTransform,离散余弦变换)。变换的输出系数接下来被量化,量化后的系数进行熵编码并成为输出码流的一部分。实际上在使用DCT变换的时候,量化后的二维的系数通常使用Zig-zag扫描将系数表示为一维的,再通过对连续0系数的个数和非0系数的大小(Level)进行编码得到一个符号,通常也有特殊的符号来表示后面剩余的所有系数全部等于0。这时候的熵编码通常使用变长编码。
解码基本上执行和编码的过程完全相反的过程。其中不能被完全恢复原来信息的步骤是量化。这时候,要尽可能接近地恢复原来的信息。这个过程被称为反量化,尽管量化本身已经注定是个不可逆过程。
视频编解码器的设计通常是标准化的,也就是说,有发布的文档来准确地规范如何进行。实际上,为了使编码的码流具有互操作性(即由A编码器编成的码流可以由B锯码器解码,反之亦然),仅仅对解码器的解码过程进行规范就足够了。通常编码的过程并不完全被一个标准所定义,用户有设计自己编码器的自由,只要用户设计的编码器编码产生的码流是符合解码规范的就可以了。因此,由不同的编码器对同样的视频源按照同样的标准进行编码,再解码后输出图像的质量往往可能相差很多。
很多视频编解码器可以很容易地在个人计算机和消费电子产品上实现,这使得在这些设备上有可能同时实现多种视频编解码器,避免了由于兼容性的原因使得某种占优势的编解码器影响其他编解码器的发展和推广。最后我们可以说,并没有哪种编解码器可以替代其它所有的编解码器。常用的视频编解码器如H.26x、MPEG、RealVideo、WMV等。
视频编解码器的主要功能是将本地视频输入设备输入的模拟视频信号,采用某种视频压缩编码标准进行压缩编码处理,产生适合于传输信道传输的码流,同时将远端会场或MCU的已经压缩编码的视频信号进行解压缩后,以某种视频图像格式输出。
视频编解码器可以支持H.261、H.262、H.263、H.263+、H.263++等图像压缩标准中的一种或几种,所采用的图像中间格式有CIF(CommonIntermediateFormat)、QCIF、4CIF、16CIF等。根据视频会议系统的类型,可以选择其中的一种或几种,没有必要支持所有格式。