Android音视频—YUV格式深入浅出
文章参考:
- 图文详解YUV420数据格式
- YUV主要采样格式理解
- YUV格式详解
- 百度百科和维基百科
概述
本文基于Android音视频开发时需要的,对基础视频流YUV格式的认识。主要描述对YUV的基本认识,YUV格式的区别,Android音视频开发时常用到的YUV格式处理,转换,显示方法等。YUV格式的认识很多引用和参考上述博文,做了一些总结,也包括一些个人的理解,还有许多开发时遇到的功能或者问题的总结。
一、什么是YUV?
YUV是一种颜色编码格式,可以说YUV流媒体是原始流数据,大部分的视频领域都在使用。他与RGB类似,但RGB更多的用于渲染时,而YUV则用在数据传输,因为它占用更少的频宽。当然,实时通讯为了降低带宽都会采用H264/H265编码。从字面意思理解,YUV的含义:Y代表亮度信息(灰度),UV分别代表色彩信息。YUV的常用名称有许多,如YUV422这是大部分镜头出来的数据,还有许多(yuv420,yuv444等)。
YUV的 planar和packed的差别?
这是yuv格式的两大类
-
planar格式:连续存储所有像素点Y,然后是所有像素点U,接着是V
-
packed格式:所有像素点的YUV信息连续交错存储
比如: YUV420P:YYYYYYYY UU VV YUV420: YUV YUV YUV
YUV,YCbCr,YPbPr写法的含义
它们分别代表在不同领域时使用的名称,总的大类都是一致的。主流上所说的YUV即是YCbCr
- YCbCr:其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量
- YPbPr:他和YCbCr的区别在于YCbCr是数字系统的标识,YPbPr是模拟系统的标识。
怎么理解YUV后面的三个数字呢?
数字代表yuv信息在像素点中的分布状况,为了维持人的肉眼观感,通常需要每个像素点保存8bit的亮度,每2x2个点保存至少一个Cb和Cr值,如下所示(要理解它的排列就要知道,它在量化8bit之后,每个像素占用大小,可以参考文章:图文详解YUV420数据格式,它里面的描述图很好理解):
-
YUV444采样,每个Y对应一组UV,8bit量化,每个像素占用3个字节。
- 四个像素点: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
- 存放码流: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
-
YUV422采样,每2个Y对应一组UV,由两个水平方向相邻的像素组成的宏像素需要占用4字节内存,亮度2个字节,两个色度各1个字节。
- 四个像素点: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
- 存放码流: Y0 U0 Y1 V1 Y2 U2 Y3 V3
-
YUV411采样,每4个Y对应一组UV,由4个水平方向相邻的像素组成的宏像素需要占用6字节内存,亮度4个字节,两个色度各1个字节。
- 四个像素点: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
- 存放码流: Y0 U0 Y1 Y2 V2 Y3
-
YUV420采样,每4个Y对应一组UV,每个由2x2个2行2列相邻的像素组成的宏像素需要