YU12、I420 和 IYUV 实际上指的是同一种 YUV 格式 ------即 YUV 4:2:0 平面格式(planar),它们在绝大多数上下文中可以互换使用。下面详细解释它们的关系与细微差异:
✅ 共同点(核心格式)
- 采样方式 :YUV 4:2:0
- 亮度 Y:全分辨率(width × height)
- 色度 U、V:各为 (width/2 × height/2)
- 内存布局 :Planar(平面)
- 先连续存储所有 Y 分量
- 然后连续存储所有 U 分量
- 最后连续存储所有 V 分量
- 总大小 :
width × height × 3 / 2字节(8-bit 每分量)
内存结构示例(W=4, H=4):
YYYYYYYY YYYYYYYY ← 16 bytes (4×4) UUUU ← 4 bytes (2×2) VVVV ← 4 bytes (2×2)
🔍 各名称来源与使用场景
| 名称 | 来源/标准 | 常见使用环境 | 备注 |
|---|---|---|---|
| I420 | FourCC 编码 | FFmpeg、WebRTC、GStreamer | 最标准的 FourCC 名称 |
| YU12 | Linux V4L2 / Mesa | Linux 视频框架、DRM、开源驱动 | 在 /usr/include/linux/videodev2.h 中定义 |
| IYUV | Intel / Windows | 早期 DirectShow、Intel 文档 | 较少用,但含义相同 |
📌 FourCC 是什么?
FourCC(Four Character Code)是用 4 个 ASCII 字符标识像素格式的标准方式。
I420的 FourCC 字节序为'I','4','2','0'- 注意:有些系统可能用小端序解释,但语义一致。
🧪 验证:它们是否真的相同?
在主流多媒体库中:
-
FFmpeg:
AV_PIX_FMT_YUV420P对应的就是 I420/YU12/IYUV。- 使用
-pix_fmt yuv420p输出的原始 YUV 文件就是这种布局。
-
OpenCV:
- 读取
.yuv文件时,若指定为 I420,则按 Y+U+V 解析。
- 读取
-
Android NDK / MediaCodec:
- 虽然更常用 NV12,但 I420 也被部分 API 支持。
-
VLC / GStreamer:
- 内部统一称为 I420。
⚠️ 注意事项
-
不要与 YV12 混淆
- YV12 = Y + V + U(U/V 顺序相反)
- 若误将 YV12 当作 I420 显示,画面会呈现紫绿色偏色
-
文件扩展名无标准
.yuv文件本身不包含格式信息,必须额外知道宽高和格式才能正确解析。
-
字节对齐问题
- 某些硬件或 API 要求 Y/U/V 平面的 stride(行字节数)对齐到 16 或 32 字节,即使图像宽度不是偶数。
✅ 总结
| 名称 | 是否等价 | 推荐使用场景 |
|---|---|---|
| I420 | ✅ 是 | 通用标准(首选) |
| YU12 | ✅ 是 | Linux / V4L2 系统 |
| IYUV | ✅ 是 | 老旧 Windows 文档 |
💡 结论:在 99% 的情况下,YU12 = I420 = IYUV,都是 YUV420 planar(Y+U+V)格式。