FFmpeg中的那些yuv格式的区别

FFmpeg支持的像素格式非常多,包括yuv420pyuyv422yuv422pyuv444pyuv410pyuv420p9leyuvj411pyuv420p16leyuv411p等等。在FFmpeg中使用AVPixelFormat枚举格式定义在在libavutil/pixfmt.h文件中。
这些格式名称中的字母都是啥意思呢,其实是有规律的,没必要去记。
pplanar,表示该格式采用线性存储。
没有p就表示为packed格式存储。
lelittle-endian,小端存储。
bebig-endian,大端存储。
jjpeg,表示每个像素的取值范围跟jpeg一样是[0,255]。如yuvj411p,取值范围就是[0,255]0表示黑色,255表示白色。而yuv411p的像素颜色范围是[16,235]16表示黑色,235表示白色
420422411:这类数字表示分量的存储比例,但是要注意的后面有0和没0的区别,比如yuv420pyuv分量的比例位4:2:0,这显然是不科学的。真实的是y分量位4uv分量总和为2,因此实际比例是4:1:1,为什么命名为yuv420p呢,其实这种命名是为了跟yuv411p格式做区分,因为yuv411p也是4:1:1,只是他们的取样方式不同,yuv420p中的4y是水平方向2y,垂直方向2y,加起来一共4y公用1u1v,而yuv411p中的4y都是水平方向的。
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意思就是水平方向2y,垂直方向2yCr就是u分量,Cb就是v分量的意思,那这个15bpp又是什么意思呢,其实他是15 bit per pixel的缩写,就是表示1个像素点有15bit组成,这个其实是可以算出来的,具体计算过程就是,没4个像素中,有4y1u1v,默认每个分量采用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。

你可能感兴趣的:(FFmpeg中的那些yuv格式的区别)