色彩 数字视频编码.docx





《色彩 数字视频编码.docx》由会员分享,可在线阅读,更多相关《色彩 数字视频编码.docx(6页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10Bit 色彩 数字视频编码 根据我最近研究高清播放的经验,得出了以下结论,如果有说的不对的欢迎指出。有关整个视频处理过程的颜色问题,水很深。 首先是目前视频本身的色系一般用的是YUV,而不是显示器输出使用的RGB。因为色度抽样(Chroma subsampling)用的是Y:Cb:Cr=4:2:0(YUV色系中,Y为亮度通道,Cb和Cr为色差通道信号),亮度抽取样(Luma subsample)和色度抽样不平衡,所以可以节省一半的空间,而只有4:4:4才是完整的色度取样。 引用一段百科:“4:2:0并不意味着只有Y,Cb而没有Cr分量。它指得是对每行扫描线来说,只有一种色度分量以2:1的抽
2、样率存储。相邻的扫描行存储不同的色度分量,也就是说,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0.以此类推。对每个色度分量来说,水平方向和竖直方向的抽样率都是2:1,所以可以说色度的抽样率是4:1。PAL制式和SECAM制式的色彩系统特别适合于用这种方式来存储。绝大多数视频编解码器都采用这种格式作为标准的输入格式。对非压缩的8比特量化的视频来说,每个由2x2个2行2列相邻的像素组成的宏像素需要占用6字节内存。” 而视频目前所使用的色深(Bit Depth)是8bit,也就是Y、Cb、Cr每个通道使用8bit存储信息,又由于4:2:0抽样,一个像素点占用8bit3/2=1
3、2bit数据量。 8bit的色深意味着Y、Cb、Cr每个通道可以取值0-255(28个),这个是全范围(Full Range);而目前视频里使用的都是有限范围(Limited Range或601 Range),Y取16-235、Cb和Cr取16-240。这个就是指输入级别(Input Level)。 H.264压缩的视频经过视频解码器(Video Decoder)解码以后生成了8bit的YUV(4:2:0)的图像,然后输出时会需要一个输出色系,主要有平面YUV:YV12、NV12等,压缩YUV:YUY2、UYVY等,RGB:RGB32、RGB24等。通常视频解码器会输出YV12。 视频解码器已
4、经将YV12的图像交给了视频渲染器(Video Renderer),视频渲染器负责将视频从YV12转换为RGB然后输出最后的画面(给显卡,显卡再将画面输出至显示器),首先最后输出的RGB通常是8bit色深,而且对于RGB肯定是4:4:4的全采样模式,RGB32就是红绿蓝各8bit,剩下一个不使用的通道占8bit,另外一种叫ARGB32,最后这个通道就是Alpha通道(透明通道)。 从YV12到RGB的过程就存在2个问题,第一个是转换矩阵,目前主要使用的YCbCr规范有2种:ITU-R BT.601和ITU-R BT.709。这2种转换矩阵会产生不同的结果,如果一个RGB视频源使用ITU-R B
5、T.601转换为YUV然后进行编码,那么最后解码以后也要用ITU-R BT.601将其转换成RGB,对于ITU-R BT.709也是一样的道理,如果最后解码时用了错误的转换矩阵,就会出来错误的颜色。 ITU-R BT.601主要是在标清时代所采用,包括DVD、NTSC、PAL和SDTV之类的;而高清视频,包括BD和HDTV以及各种高清的重编码,多数都是使用ITU-R BT.709。但也可能存在少数例外,解码这些例外时就很容易因为使用了错误的转换矩阵而得出错误的颜色。比如AIR的BD就存在一定争议,这个BD用了MPEG-2编码,是从DVD的标清视频直接upconv上来的,分辨率是1920x108
6、0,帧模式十分混乱,各种24t、30i、30p混杂在一起。如果从它是DVD upconv来看,应该是用BT.601,但是BD/高清视频应该是普遍使用BT.709的,所以它到底是什么,还真的说不清楚。 第二个问题是输出级别(Output Level),决定转换后的RGB的每个通道的范围。一般有2种,Full Range的电脑显示器(RGB:16-255),Limited Range的电视机(RGB:16-235),但是现在有不少电视机也是支持0-255的全范围输入的,所以需要有正确的判断。而且电视机的画面的设置调整也很重要,需要配合Super HiVi CAST一类的调整视频来调出正确的黑位和白
7、位。 将Limited Range转换至Full Range的RGB,这个过程可以称作YC伸张,反过来的话就是YC压缩。在高清播放中这个很关键,一般如果输入是Limited Range,而你输出的设备支持Full Range,那要做1次YC伸张;如果输出设备是Limited Range或者输入是Full Range,那么就不需要做YC伸张。而可以做YC伸张的东西有视频解码器、视频渲染器、播放器的Shader后处理、显卡,所以控制好他们最后做的YC伸张的次数成了一个关键。幸好现在Win7下EVR一般会对YV12输入做一次YC伸张,对RGB32输入不做改变,而显卡通常不去做改变,所以还是比较容易控
8、制的,以前XP系统时用VMR7/9作渲染器,就很容易碰到黑位不正的问题,往往就是YC伸张没做对。 引用一段六维的zfylich写的教程:TV/PCRange:TVrange - PC Range称之为YC伸张;提到这个主要涉及一个YC压缩和伸张的过程,该过程出现来自于BT.601和BT.709(601标准的高清版)标示颜色的可取数值与实际可取数值的偏差导致。在601标准中,YC的每个通道可取值并没有256个,对色度通道,可取值是16-240,对亮度通道,可取值只有16-235,这么设计是考虑到了模拟信号传输过程中的过冲效应(Gibbs效应);值得注意的是,在电脑播放的过程中,使用的是每个通道0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 色彩 数字视频编码 数字视频 编码

限制150内