视频编解码学习(1):YUV格式学习

1.YUV格式详解

参考文章 :

http://blog.csdn.net/linweig/article/details/5515928

http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

http://blog.csdn.net/leixiaohua1020/article/details/25346147


这些文章我学习到几点,现在记录下来:

a. YUV(亦称YCrCb)是三个分量,Y是亮度信息,U,V是色度信号。如果只有Y,那么电视播放出来的是黑白,Y加上U,V后就是彩色电视。

这样解决黑白电视也能播放彩色电视的信号的问题。


b. 刚开始学,不能贪多。我就先说说YUV420格式吧。

YUV 4:2:0采样,即每4个Y公用一组UV分量。如下图:


因为一个Y分量对应一个像素点,所以若该图片的宽为width, 高为height,那么Y就等于(width * height),同理U就等于(Y / 4), V也等于(Y / 4)

那么这个YUV图片在内存中的长度就为:Y + Y/4 + Y/4 = (Y * 3) / 2 = (width * height) / 2


当然YUU420还可以细分为YUV420p,YUV420sp,这个暂时先放放,后面遇到再说话。


既然上面是理论知识,我们就需要学习一些代码来实践一下。第3个URL里面就是实际的代码。我现在截取一点分析一下。

int numBtyes = avpicture_get_size(AV_PIX_FMT_YUVJ420P, 480, 272);
返回的值为:195840 = (480 * 272 * 3) /2;

验证了我们的结果。

同理,下面还有一段代码:

    //Read YUV
    FILE *in_file = fopen("cuc_view_480x272.yuv", "rb");
    if( fread(picture_buf, 1, y_size*3/2, in_file) <= 0 )  {
        printf("Could not read input file.");
        return -1;
    }
    picture->data[0] = picture_buf;             // Y
    picture->data[1] = picture_buf+ y_size;     // U
    picture->data[2] = picture_buf+ y_size*5/4; // V
这里y_size的值为: 480 * 272 ,即130560

我翻译一下就是:

picture->data[0] = picture_buf;

picture->data[1] = picture_buf + 130560;

picture->data[2] = picture_buf + 163200;

正好就把Y,U,V三个分量取了出来。



//

// 2015/7/31添加

2. YUV的 packet格式 和 planar格式

YUV格式有两大类:planar和packed。

对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。

对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。







    















评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值