1 YUV文件格式
简述
YUV存储纯数据. 没有帧头信息;
向解码器(以ffmpeg为例)传递
分辨率
和色彩编码格式
解码器根据给定的参数计算每帧具体大小为多少
1920*1080
uyvy422
就可以知道 一帧约为 4 MB
每个像素2字节(
uyvy422
属于YUV4:2:2)2x1920x1080 = 4147200 B = 3.955078125 MB ~= 4MB
存储亮度(Y)和色度(U和V)信息
1.1 YUV格式
YUV格式分为两大类: planar(平面) 和 packed(打包)
-
planar格式
依次连续存储所有像素点的Y分量/U分量/V分量
YY................YY UU................UU VV................VV
类似于纵向读取单个像素点的YUV信息; 实际存储数据不是三维而是一维
提取像素点的YUV数据通过固定的偏移量获取
-
packed格式,每个像素点的Y, U, V分量是连续存储的
…待补充
1.2 YUV采样方式
不同的采样方式决定了 像素点 数据大小
采样方式的主流方式分为: YUV4:4:4
/ YUV4:2:2
/ YUV4:2:0
⚫️ 表示Y分量; ⚪️ 表示一组UV分量
-
YUV4:4:4
每组UV分量被1个Y分量使用
平均每个像素点的YUV占
8+8+8=24bits
3个字节 -
YUV4:2:2
每组UV分量被2个Y分量共享
平均每个像素点的YUV占
8+4+4=16bits
2个字节 -
YUV4:2:0
每组UV分量被4个Y分量共享
平均每个像素点的YUV占
8+2+2=12bits
1.5个字节
如何采样出每组UV被多个Y分量共享?
像素块(4x4) 以YUV4:2:0为例;
获取16个点的Y分量后; 通常UV分量的值通过相邻像素的色度平均或其他插值方法计算
在平面格式中的存在形式
# 实际数据是一维; 分量均为 8bit
# 不会出现字节对齐问题
Y Y Y Y
Y Y Y Y
Y Y Y Y
Y Y Y Y
U U
U U
V V
V V
1.3 YUV存储方式
这里的存储方式就是我们在编码中实际遇到的 色彩编码格式
1.3.1 UYVY格式
属于YUV422采样; 使用打包格式
以4x4像素块为例; 应该有16个Y分量和8组uv分量
# 实际数据是一维; 分量均为 8bit
U1 Y01 V1 Y02 U2 Y03 V2 Y04
U3 Y05 V3 Y06 U4 Y07 V4 Y08
U5 Y09 V5 Y10 U6 Y11 V6 Y12
U7 Y13 V7 Y14 U8 Y15 V8 Y16
UYVY格式通常用于视频编码和传输中,它以较高的色度采样率为基础,同时在相对较小的数据量下提供了良好的图像质量。
1.3.2 YUVY格式
属于YUV422采样; 使用打包格式
与UYVY的不同在于U和V分量的位置交换
以4x4像素块为例; 应该有16个Y分量和8组uv分量
# 实际数据是一维;分量均为 8 位
Y01 U1 Y02 V1 Y03 U2 Y04 V2
Y05 U3 Y06 V3 Y07 U4 Y08 V4
Y09 U5 Y10 V5 Y11 U6 Y12 V6
Y13 U7 Y14 V7 Y15 U8 Y16 V8
1.3.3 YUV422P格式
属于YUV422采样; 使用平面格式
以4x4像素块为例; 应该有16个Y分量和8组uv分量
# 实际数据是一维;分量均为 8 位
Y01 Y02 Y03 Y04
Y05 Y06 Y07 Y08
Y09 Y10 Y11 Y12
Y13 Y14 Y15 Y16
U1 U2 U3 U4 U5 U6 U7 U8
V1 V2 V3 V4 V5 V6 V7 V8
1.3.4 YV12格式
属于YUV420采样; 使用平面格式
以4x4像素块为例; 应该有16个Y分量和4组uv分量
Y01 Y02 Y03 Y04
Y05 Y06 Y07 Y08
Y09 Y10 Y11 Y12
Y13 Y14 Y15 Y16
V1 V2 V3 V4
U1 U2 U3 U4
1.3.5 YU12格式
属于YUV420采样; 使用平面格式
以4x4像素块为例; 应该有16个Y分量和4组uv分量
Y01 Y02 Y03 Y04
Y05 Y06 Y07 Y08
Y09 Y10 Y11 Y12
Y13 Y14 Y15 Y16
U1 U2 U3 U4
V1 V2 V3 V4
1.3.6 NV12格式
属于YUV420采样; 使用平面格式(类似)
U和V分量被交错存储在同一平面中
以4x4像素块为例; 应该有16个Y分量和4组uv分量
# 实际数据是一维;分量均为 8 位
# Y分量
Y01 Y02 Y03 Y04
Y05 Y06 Y07 Y08
Y09 Y10 Y11 Y12
Y13 Y14 Y15 Y16
# UV分量(交错存储)
U1 V1 U2 V2 U3 V3 U4 V4
1.3.7 NV21格式
# 实际数据是一维;分量均为 8 位
# Y分量
Y01 Y02 Y03 Y04
Y05 Y06 Y07 Y08
Y09 Y10 Y11 Y12
Y13 Y14 Y15 Y16
# UV分量(交错存储,顺序相反)
V1 U1 V2 U2 V3 U3 V4 U4
2 PCM文件格式
PCM文件有多种格式(线性PCM/对数PCM/差分PCM)
计算pcm一帧数据大小 只需要知道采样率
位深度
通道数
计算公式: 一帧大小(字节) = (采样率 × 位深度 × 通道数) / 8
例: 采样率: 48000Hz; 位每采样: 32; 通道数:1
一帧大小为 187.5 KB
48000 x 32 / (8 x 1024) == 187.5KB