音视频开发-YUV数据

YUV数据类型

  • h264编码中,我们使用YUV数据类型进行传输,从采集端采集的RGB转YUV,通过网络传输到接收端,YUV再转成RGB进行显示。
  • 期间涉及数据的压缩,RGB->YUV数据,数据大小比率为2:1,即RGB占用的数据大小为(Width * Height)*3,因为一个像素点需要红黄蓝三种数据表示,而YUV数据则只需要 (Width * Height)*3/2,因为YUV每一个像素点有一个Y(亮度)数据,且一般采用4:2:0的比例,即4个Y共用1个U和1个V.相比原始4:4:4(1个Y用1个U,1个V),则为一半的存储量。
  • 对于YUV数据,YUV的分布原本是4:4:4,但人眼对于亮度(Y)的改变更灵敏,对于色度(UV也称作CrCb)不敏感,所以存储时,丢弃了部分的色度的数据,达到压缩的目的。
    在这里插入图片描述
    这里是Y0Y1Y6Y7共用U0V0,为什么不是Y0Y1Y2Y3共用U0V0呢,这与H264压缩技术有关,一个宏块内,临近的字块当然色度值相差最小,我是这样认为的。
    H264基本原理 https://www.jianshu.com/p/97b4dc8c7f00
    这篇文字写的很好

I420 与 YV12

两者都属于planar的数据形式,关于planar和packet,这里阐述下:
planar模式示例: Y0Y1…Yn U0U1…Um V0V1…Vm,YUV三个通道分别连续存储;
packet模式举例: Y0U0V0 + Y1U1V1 + … + YnUnVn,YUV三个通道混合存储。
我们收到的i420数据是3通道,尤其是在代码中,我们会逐一获取单个平面的数据。

i420的数据排列

i420的数据排列为 Y0Y1…Yn + U0U1…Un + V0V1…Vn
即获取到char *data的类型数据,数据顺序依次是Y,再紧接U和V.
由于Y的数据大小,可以根据4:2:0获取,其长度为 w i d t h ∗ h e i g h t width *height widthheight,因为总长度为 w i d t h ∗ h e i g h t ∗ 3 / 2 width *height*3/2 widthheight3/2.这在上面已经说明。
U和V的大小则是Y长度的1/4,则可以根据地址和长度取出。

YV12的数据排列

跟i420不一样的是,U和V的顺序相反。
YV12的数据排列为 Y0Y1…Yn + V0V1…Vn + U0U1…Un

NV12 和 NV21

NV12的数据排列为 Y0Y1…Yn + U0V0U1V1…UnVn
NV21的数据排列为 Y0Y1…Yn + V0U0V1U1…VnUn
两者的区别在于UV的顺序不同,与i420不同,UV是一起连着存储的。

其他的yuv数据类型原理一样

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值