YUV420 总结 (YU12、YV12、NV12 和 NV21)

本文详细介绍了YUV模型,包括YUV420P、YUV420SP格式的平面和交错存储方式,以及YU12、YV12、NV12和NV21的具体数据分布。重点讲解了这些格式在视频编码和处理中的常见用途。

YUV模型是根据一个亮度(Y分量)和两个色度(UV分量)来定义颜色空间。最常见的格式为 YUV420分为两种:YUV420P和YUV420SP。

YUV420P

YUV420P 为 plane平面模式,Y, U, V分量处于不同平面,即在 ffmpeg 中数据存放在 3 个数组中。
其可再细分为 YU12 和 YV12 。

YU12(I420)

该格式的数据分布如下图所示,data[0] 中存放的是 Y 数据,data[1] 中存放的是 U 数据,data[2] 中存放的是 V 数据。
其中 Y、U、V 颜色相同的为一组数据,如 Y1、Y2、Y3 和 Y4 共用一组 U1 和 V1。
在这里插入图片描述

YV12

该格式的数据分布如下图所示,data[0] 中存放的是 Y 数据,data[1] 中存放的是 V 数据,data[2] 中存放的是 U 数据。
在这里插入图片描述

YUV420SP

YUV420SP 为 semi-planar 模式,即Y和UV分为两个plane,但是UV(CbCr)为交错存储,而不是分为三个平面。即在 ffmpeg 中数据存放在 2 个数组中。
其可再细分为 NV12 和 NV21。

NV12

该格式的数据分布如下图所示,data[0] 中存放的是 Y 数据,data[1] 中存放的是 U 和 V 数据,两者交错放置,先是 U 分量,后是 V 分量。
在这里插入图片描述

NV21

该格式的数据分布如下图所示,data[0] 中存放的是 Y 数据,data[1] 中存放的是 U 和 V 数据,两者交错放置,先是 V 分量,后是 U 分量。
在这里插入图片描述

真实数据存放

真实存放数据时,为了方便运算,往往将数据进行对齐,所以真实的数据存放如下图。
以 YU12 为例子,其他格式类似。
在这里插入图片描述

参考文献:
https://blog.youkuaiyun.com/byhook/article/details/84037338
https://blog.youkuaiyun.com/Evankaka/article/details/38176025
https://www.cnblogs.com/leisure_chn/p/10290575.html

<think> 我们正在讨论YUV图像格式。用户询问.yuv420NV12文件.yuv文件的区别。根据引用内容,我们需要明确几个概念: 1. YUV420是一种采样格式,它分为两种存储排列方式:planar(YUV420P)semi-planar(YUV420SP)。 2. YUV420P又分为I420(即YU12YV12。它们都是先存储所有Y分量,然后存储U分量(或V分量),最后存储V分量(或U分量)。 3. YUV420SP则分为NV12NV21。它们都是先存储所有Y分量,然后交替存储UV分量(NV12是U在先,V在后;NV21是V在先,U在后)。 通常,.yuv文件是一个通用的扩展名,它可能包含任意YUV格式的数据。而.yuv420NV12文件则特指NV12格式的YUV420文件。 具体区别如下: 1. **文件扩展名**: - `.yuv`:这是一个通用扩展名,不特指某种具体的存储格式。它可能包含I420YV12NV12NV21或其他YUV格式的数据。 - `.yuv420NV12`:这是一个更具体的扩展名,明确表示文件中的数据是NV12格式(属于YUV420SP)。 2. **数据排列方式**: - 对于NV12YUV420SP): - 首先存储所有像素的Y分量(亮度)。 - 然后存储UV分量(色度),其中UV分量以交错的方式存储:即U0, V0, U1, V1, ...(注意:NV12是先U后V,而NV21是先V后U)。 - 以4x4图像为例,内存占用为:4*4(Y分量)+ 4*4/2(UV分量,因为UV分量在水平垂直方向都做了2:1的采样) = 24字节。存储顺序为: ``` Y00 Y01 Y02 Y03 Y10 Y11 Y12 Y13 Y20 Y21 Y22 Y23 Y30 Y31 Y32 Y33 U00 V00 U01 V01 U10 V10 U11 V11 ``` 实际上,NV12的UV分量是以2x2块的形式存储的,所以对于4x4图像,UV部分有2行,每行有2个UV对(每个UV对包含一个U一个V)。 - 而一般的.yuv文件如果是指I420YUV420P的一种): - 先存储所有Y分量(4x4图像有16个Y)。 - 然后存储所有U分量(4x4图像的U分量在水平垂直方向都是原图的一半,所以有2x2=4个U)。 - 最后存储所有V分量(同样4个V)。 - 存储顺序为: ``` Y00 Y01 Y02 Y03 Y10 Y11 Y12 Y13 Y20 Y21 Y22 Y23 Y30 Y31 Y32 Y33 U00 U01 U10 U11 V00 V01 V10 V11 ``` 3. **如何区分**: - 由于扩展名并不是强制标准,所以不能完全依赖扩展名。通常需要根据文件来源或参数说明来确定。 - 如果文件没有明确说明格式,可以通过分析文件大小图像分辨率来推测。例如,对于分辨率为$W \times H$的图像: - YUV420格式(无论是P还是SP)的文件大小都是$W \times H \times 3/2$字节(因为Y分量有$W \times H$个,UV分量合起来有$W \times H / 2$个,但注意YUV420SP的UV是交错存储的,而YUV420P是分开存储的,但总大小相同)。 - 因此,仅通过文件大小无法区分NV12I420,必须知道排列方式。 4. **使用注意事项**: - 在指定格式的播放器中查看时,必须设置正确的格式(如NV12或I420)才能正确显示。 - 如果格式设置错误,会出现颜色错乱。 总结:`.yuv420NV12`文件特指NV12格式的YUV420图像数据,而`.yuv`文件通常泛指YUV格式,但具体格式需要根据上下文确定。两者的主要区别在于色度分量(UV)的存储方式:NV12是UV交错存储(semi-planar),而常见的.yuv文件如果指的是I420则是平面存储(planar)且先U后V,如果是YV12则是平面存储先V后U。 注意:在有些情况下,.yuv文件可能默认指I420(即YUV420P),但这不是绝对的,因此最好通过具体格式名称来指定。 根据引用[1][2],我们可以明确: - YUV420SP包括NV12NV21,而YUV420P包括I420YV12。 - NV12的存储顺序为:先Y平面,然后是UV交错平面(U在前,V在后)。 因此,当我们说一个文件是.yuv420NV12时,我们明确知道它是NV12格式,而.yuv文件则可能是其他YUV格式。 </think>### YUV420NV12文件与YUV文件的区别 #### 1. **概念范围不同** - **`.yuv`文件**:泛指所有YUV格式的原始数据文件,包含多种子格式: - 包括YUV420P(如I420/YV12)、YUV420SP(如NV12/NV21)等 - 文件本身不包含格式标识,需人工指定参数才能正确解析[^1][^3] - **`.yuv420NV12`文件**:特指NV12格式的YUV420文件: - 明确采用YUV420SP中的NV12存储格式 - 文件命名已包含完整格式信息(采样方式+存储顺序)[^2] #### 2. **数据存储结构差异** | 特征 | `.yuv` (通用) | `.yuv420NV12` (特定) | |--------------|------------------------|--------------------------| | **亮度分量** | 所有格式都先存储Y平面 | 先存储完整的Y平面 | | **色度分量** | 可能分离存储(U/V) | UV分量交错存储 | | **排列方式** | 可能是planar或packed | 固定semi-planar布局 | | **示例结构** | `YYYY...UUU...VVV...` | `YYYY...UVUVUV...` | 以$4\times4$分辨率的图像为例: ```math \begin{array}{c|c} \text{通用.yuv (I420格式)} & \text{专用.yuv420NV12} \\ \hline \begin{matrix} Y_{00} & Y_{01} & Y_{02} & Y_{03} \\ Y_{10} & Y_{11} & Y_{12} & Y_{13} \\ Y_{20} & Y_{21} & Y_{22} & Y_{23} \\ Y_{30} & Y_{31} & Y_{32} & Y_{33} \\ U_{00} & U_{01} \\ U_{10} & U_{11} \\ V_{00} & V_{01} \\ V_{10} & V_{11} \\ \end{matrix} & \begin{matrix} Y_{00} & Y_{01} & Y_{02} & Y_{03} \\ Y_{10} & Y_{11} & Y_{12} & Y_{13} \\ Y_{20} & Y_{21} & Y_{22} & Y_{23} \\ Y_{30} & Y_{31} & Y_{32} & Y_{33} \\ U_{00} & V_{00} & U_{01} & V_{01} \\ U_{10} & V_{10} & U_{11} & V_{11} \\ \end{matrix} \end{array} ``` * 两者数据量相同:均为$\frac{3}{2} \times W \times H$字节(示例为$24$字节) * 关键区别在色度分量排布[^2][^3] #### 3. **应用场景区别** - **`.yuv`文件**: - 常见于视频编解码测试序列(如`foreman.yuv`) - 需配套说明文件描述具体格式 - 默认常指I420格式(YUV420P)[^1] - **`.yuv420NV12`文件**: - 主要用于移动端硬件加速场景 - Android相机输出/NVIDIA编解码器默认格式 - OpenGL可直接上传为纹理(GL_LUMINANCE_ALPHA格式) #### 4. **使用注意事项** 1. **解析要求**: - `.yuv`文件必须额外提供: - 分辨率(如$1920\times1080$) - 具体格式(如I420/NV12) - `.yuv420NV12`只需分辨率即可解析 2. **转换关系**: ```math \text{I420} \xrightarrow{\text{重排UV}} \text{NV12} \quad \text{FFmpeg命令:} ``` ```bash ffmpeg -s 1920x1080 -pix_fmt yuv420p -i input.yuv -pix_fmt nv12 output.yuv420nv12 ``` 3. **错误处理**: - 若将NV12误认为I420读取:会显示青红色调错乱 - 典型错误:用`yuvplayer`打开NV12文件时未选择"420SP"格式 > 💡 建议:在文件命名中加入格式标识(如`video_1080p_nv12.yuv`),避免混淆[^1][^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值