C++音视频八股文(视频图像基础)
1. 什么是YUV颜色空间?YUV和RGB有什么区别?
YUV颜色空间:
- Y表示亮度(Luminance),U和V表示色度(Chrominance)
- 将亮度信息和色彩信息分离
- 源于模拟电视时代,兼容黑白电视
- 数字视频中常用YCbCr(Y表示亮度,Cb和Cr表示色差)
RGB颜色空间:
- 由红(R)、绿(G)、蓝(B)三原色组成
- 每个像素用三个分量表示
- 计算机显示器的原生格式
- 适合图像显示和处理
主要区别:
分量含义 |
亮度+色度 |
三原色 |
人眼敏感度 |
利用人眼对亮度敏感 |
均等对待 |
压缩效率 |
高(可色度采样) |
低 |
应用场景 |
视频编码、传输 |
图像显示、处理 |
数据量 |
可减少(如YUV420) |
固定 |
转换关系:
RGB → YUV: Y = 0.299R + 0.587G + 0.114B U = -0.147R - 0.289G + 0.436B V = 0.615R - 0.515G - 0.100B YUV → RGB: R = Y + 1.140V G = Y - 0.395U - 0.581V B = Y + 2.032U
优势:
- YUV可以对色度分量降采样,人眼不易察觉
- 节省带宽和存储空间
- 所有视频编码标准(H.264/H.265)都使用YUV
2. YUV420、YUV422、YUV444的区别是什么?
这些格式的区别在于色度采样比例:
YUV444:
- 采样比例 4:4:4
- Y、U、V分量分辨率相同
- 每个像素都有完整的YUV信息
- 无色度损失,质量最高
- 数据量:每像素3字节(24bit)
- 适合:专业视频制作、无损处理
YUV422:
- 采样比例 4:2:2
- Y分量全分辨率,U和V水平方向减半
- 水平每2个像素共享一组UV
- 数据量:每像素2字节(16bit)
- 相比YUV444节省33%
- 适合:专业视频采集、广播级设备
YUV420:
- 采样比例 4:2:0
- Y分量全分辨率,U和V水平和垂直方向都减半
- 每4个像素共享一组UV
- 数据量:每像素1.5字节(12bit)
- 相比YUV444节省50%
- 适合:消费级视频、流媒体、H.264/H.265编码
- 最常用的格式
对比示例(4x4像素块):
YUV444: 16个Y + 16个U + 16个V = 48字节 YUV422: 16个Y + 8个U + 8个V = 32字节 YUV420: 16个Y + 4个U + 4个V = 24字节
采样示意图:
YUV444: Y Y Y Y U U U U V V V V
Y Y Y Y U U U U V V V V
YUV422: Y Y Y Y U U V V
Y Y Y Y U U V V
YUV420: Y Y Y Y U V
Y Y Y Y
3. YUV420P、YUV420SP(NV12、NV21)的数据排列方式有何不同?
这些都是YUV420格式,区别在于内存排列方式:
YUV420P(Planar平面格式):
- 也称I420
- Y、U、V三个分量分别连续存储
- 内存布局:
[Y平面] [U平面] [V平面] - 示例(4x4图像):
- FFmpeg默认格式
- 便于单独处理每个分量
YUV420SP(Semi-Planar半平面格式):
- Y分量单独存储,UV分量交错存储
- 分为NV12和NV21两种
NV12:
- 内存布局:
[Y平面] [UV交错] - UV排列:UVUVUVUV...
- 示例(4x4图像):
- Android、iOS硬件编码器常用
- 硬件加速友好
NV21:
- 内存布局:
[Y平面] [VU交错] - VU排列:VUVUVUVU...
- 示例(4x4图像):
- Android Camera默认格式
对比总结:
I420/YUV420P |
连续 |
连续 |
连续 |
软件编码 |
NV12 |
连续 |
与V交错 |
与U交错 |
硬件编码 |
NV21 |
连续 |
与V交错 |
与U交错 |
Android相机 |
格式转换:
- I420 ↔ NV12:需要重排UV数据
- NV12 ↔ NV21:只需交换UV顺序
4. 如何计算一帧YUV420P图像占用的内存大小?
YUV420P内存计算公式:
总大小 = Y平面大小 + U平面大小 + V平面大小
各平面大小:
- Y平面:width × height(全分辨率)
- U平面:(width/2) × (height/2) = width × height / 4
- V平面:(width/2) × (height/2) = width × height / 4
总大小:
总大小 = width × height + width × h
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。