FFmpeg中的那些yuv格式的区别
FFmpeg支持的像素格式非常多,包括yuv420p
、yuyv422
、yuv422p
、yuv444p
、yuv410p
、yuv420p9le
、yuvj411p
、yuv420p16le
、yuv411p
等等。在FFmpeg中使用AVPixelFormat
枚举格式定义在在libavutil/pixfmt.h
文件中。
这些格式名称中的字母都是啥意思呢,其实是有规律的,没必要去记。
p
:planar
,表示该格式采用线性存储。
没有p
就表示为packed
格式存储。
le
:little-endian
,小端存储。
be
:big-endian
,大端存储。
j
:jpeg
,表示每个像素的取值范围跟jpeg
一样是[0,255]
。如yuvj411p
,取值范围就是[0,255]
,0
表示黑色,255
表示白色。而yuv411p
的像素颜色范围是[16,235]
,16
表示黑色,235
表示白色
420
、422
、411
:这类数字表示分量的存储比例,但是要注意的后面有0
和没0
的区别,比如yuv420p
,y
、u
、v
分量的比例位4:2:0
,这显然是不科学的。真实的是y
分量位4
,uv
分量总和为2
,因此实际比例是4:1:1
,为什么命名为yuv420p
呢,其实这种命名是为了跟yuv411p
格式做区分,因为yuv411p
也是4:1:1
,只是他们的取样方式不同,yuv420p
中的4
个y
是水平方向2
个y
,垂直方向2
个y
,加起来一共4
个y
公用1
个u
,1
个v
,而yuv411p
中的4
个y
都是水平方向的。
p
后面的数字,如p10
表示一个分量使用10
位存储,没有数字就默认是8
位。
这些在AVPixelFormat
枚举中注释中都有标注
AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian
AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range
注释中的2x2
意思就是水平方向2
个y
,垂直方向2
个y
,Cr
就是u
分量,Cb
就是v
分量的意思,那这个15bpp
又是什么意思呢,其实他是15 bit per pixel
的缩写,就是表示1
个像素点有15
个bit
组成,这个其实是可以算出来的,具体计算过程就是,没4
个像素中,有4
个y
、1
个u
、1
个v
,默认每个分量采用10
位存储,那么4
个像素就有(4+1+1)*10=60
位,那么1
个像素点就是60/4=15
个bit。
知道了这些规律,那咱么只要看到像素的名称,就知道他的存储方式了,知道每个像素占几个bit了。
根据这个咱们来看个具体的像素格式。
yuva422p16le
采用planar
存储,一个分量是16
位使用小端模式存储,分量比例是4:2:2
,并且每个像素还存储了透明度alpha,那么每个像素就是(4+2+2+4)*16/4=48
个bit。
作者:iOS开发之FFmpeg
原文链接:https://www.jianshu.com/p/9a2f8dcb6009