该节是ffmpeg开发播放器学习笔记
的第三节《认识YUV》
简单的讲YUV是一种图像和视频的编码方式,RGB通过三种颜色来表达现实世界中的各种颜色,YUV通过亮度与色度饱和度来表示颜色。
RGB很好理解,它更直观。从学生开始就认识绘画的颜料是用三种颜色调配来的,汽车的油漆颜色也是RGB三种颜色调配而来的。
YUV的出现有它的历史意义但也是一种必然。它基于人眼对亮度的敏感度比色彩的敏感度更高的特点。Y表示亮度也可以理解在灰度值,最低的亮度就是黑色最高的亮度就是白色,中间的可呈现出灰色。
在黑白电视机向彩色电视机过渡的年代,黑白电视机只需要YUV中的一个分量Y就可以呈现出黑白画面。UV分量用在彩色电视机上即可呈现出彩色了。YUV可以带来更高的帧内压缩比,由于人眼对黑白更敏感,YUV可以弱化不敏感的信息,减少UV分量的采样。RGB24的每个像素需要3*8个字节,YUV呢?不同的YUV采样方式压缩比有所不同。
电视信息使用的是YUV而数字信息使用的是YCrCb命令,以下统称YUV。
✅ 第一节 - Hello FFmpeg
✅ 第二节 - 软解视频流,渲染 RGB24
🔔 第三节 - 认识YUV 📗 第四节 - 硬解码,OpenGL渲染YUV
📗 第五节 - Metal 渲染YUV
📗 第六节 - 解码音频,使用AudioQueue 播放
📗 第七节 - 音视频同步
📗 第八节 - 完善播放控制
📗 第九节 - 倍速播放
📗 第十节 - 增加视频过滤效果
📗 第十一节 - 音频变声
实例代码提供了Objective-C
与Swift
两种实现,为了方便说明,文章引用的是Objective-C
代码,因为Swift
代码指针看着不简洁。
目标
- 了解YUV采样方式
- 了解YUV存储方式
了解YUV采样方式
4:4:4采样
每一个Y都对应一组UV,这种采样方式与RGB比较类似。这种采样方式保留了所有的细节,亮度与色度都保留了,所以压缩率很低,但是好处是还原后的图像也就完美。它最要用在对带宽要求不高并且对图像质量特点是细节要求高的场景。对于4:4:4的采样方式来讲,采样编码与,存储,还原都一样。4:2:2
4:2:2采样方式意思就是4个Y对应两组UV,即2个Y对应一组UV的方式进行采样。进行还原的时候也是每相邻的两个Y共享一组UV。这样的采样方式丢弃了部分色度数据,还原的时候共享了色度,大部分图像或者视频中不敏感感觉不出来,但是在要求很高边界清晰的图像或者视频里可能会看到原本锐利的边界变得模糊了。4:1:1
在原始数据保持不变的情况下,4:1:1采样压缩率更高,但是丢弃的色度数据也更多,每个4个Y共享一组UV。4:2:0
4:2:0采样并不是说Y采样,U采样2个V采样0个。而是指第一行按2:1的比例采样2个Y一个U,不采样V。第二行采样2个Y两个V,不采样U。
也可以说是水平采样与垂直采样。这样采样的结果就是相邻相关的两行按2x2的方式组合成了一个编码组,每一个2X2包含6个数据,还原成4个像素点组合。
了解YUV存储方式
除了采样方式与RGB不一样,存在方式与RGB也有着差异,YUV有两种存储方式:打包
与扁平
。 打包存储
: YUV数据交叉连续存储在一个平面上。 扁平存储
: Y,UV或者Y,U,V分别存储在不同的平面。
不同的YUV格式有不同的存储方式,这里以FFmpeg中420P举例,YUV数据分别存储在三个平面。他是这样存储的:
以上就是采样与存储的一些基础知识。
对YUV有一定了解之后就可以开始渲染YUV数据帧了。
总结:
• 认识YUV,了解了YUV的历史由来。
• 分别详细介绍了4种不同的YUV采样方式,了解了每一种采样方式的特点与压缩比
• YUV存储分两类,打包与扁平。打包方式是将数据存放到一个平台,可以交叉也可以一个分量数据存储完之后再存另一个分量。扁平方式将数据分别存到不同的平面。
更多内容请关注微信公众号<<程序猿搬砖>>