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。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务