目录
觉得有用,就请您帮忙点赞转发收藏吧,您的鼓励是我创作的动力,多谢看官。
由于能力水平有限,文中的错误或不严谨的地方在所难免,还请批评指正。
视频编码几乎全用 YUV(实为 YCbCr)而不用 RGB,核心原因是YUV 分离亮度与色度,可利用人眼对色度不敏感的特性进行色度下采样(如 4:2:0),在几乎无损视觉质量的前提下将数据量减少约 50%,且通道间相关性低更利于压缩;而 RGB 三通道强相关且无法独立压缩色度,压缩效率极低。
一句话结论:RGB 给人看,YUV 给压缩看。
一、先说一个残酷的现实
你屏幕上是 RGB,相机 CMOS 出来是 Bayer,但最终进 H264 / HEVC / AV1 的永远是:
RGB → YUV → 压缩 → 文件
你问 FFmpeg:
ffmpeg -pix_fmt rgb24 -c:v libx264 out.mp4
它会默默干一件事:
先帮你转成 YUV420P,再编码
因为:
视频编码标准里 根本就没定义 RGB 压缩模式(主流 profile)
二、RGB 和 YUV 的本质差别
RGB 是什么?
每个像素:
R G B
亮度 + 颜色 + 颜色
三个通道地位平等、强耦合、空间相关性弱
人眼看到的是:
-
红墙
-
蓝衣服
-
绿草地
YUV 是什么?
Y = 亮度(黑白)
U = 蓝色差
V = 红色差
把“明暗”和“颜色”强行拆家
人眼真实生理是:
-
对亮度极度敏感(800 万视锥细胞盯着 Y)
-
对颜色分辨率极低(周边余光糊成一片)
YUV 是 人类视觉系统的数学作弊器
三、为什么编码标准集体选 YUV?
核心原因只有一个字:省
1️.人眼对颜色不敏感 → UV 可以降维打击
RGB24 一张 1920×1080 帧:
| 格式 | 字节数 |
|---|---|
| RGB24 | 1920×1080×3 = 6.22 MB |
| YUV420P | 1920×1080×1.5 = 3.11 MB |
体积直接腰斩,肉眼看不出区别
原因:
-
UV 水平 / 垂直都 2:1 下采样
-
人眼不会骂娘
2️.运动估计只关心“形状不是颜色”
H264 干的最累的事是:
-
宏块匹配
-
运动矢量搜索
-
残差预测
这些只看 Y 分量
如果 RGB:
-
R/G/B 三个平面都在动
-
边缘在不同通道错位
-
ME 直接哭死
YUV 的好处是:
| 任务 | YUV | RGB |
|---|---|---|
| 运动搜索 | 只看 Y | 看三次 |
| 残差能量 | 集中在 Y | 分散 |
| DCT 效率 | 极高 | 一般 |
3️.频域变换友好度:YUV ≫ RGB
DCT / iDCT(H264 / HEVC 核心):
-
低频能量集中在左上角
-
量化后大量 0
RGB 的问题:
-
色彩通道高频多
-
量化后马赛克花脸
YUV 是天然“为 DCT 铺好的路”
四、RGB vs YUV:特性对照表
| 对比项 | RGB | YUV420P |
|---|---|---|
| 是否贴近显示 | ✅ 是 | ❌ 否 |
| 是否贴近人眼 | ❌ 否 | ✅ 是 |
| 单帧大小 1080p | 6.2 MB | 3.1 MB |
| 运动估计效率 | 低 | 极高 |
| DCT 能量集中 | 一般 | 极强 |
| 色度下采样 | ❌ 不支持 | ✅ 原生支持 |
| 编码标准支持 | 基本无 | 所有主流标准 |
| 硬件加速友好 | 差 | 天生适配 |
| 适合用途 | UI / 纹理 / OpenGL | 视频 / 流媒体 |
五、为什么“视频编码标准”不标准化 RGB?
技术上当然能,但没人干:
H264 Main Profile 之后:
-
只定义 4:2:0 / 4:2:2 / 4:4:4 YCbCr
-
4:4:4 都算“专业档”(Apple ProRes / JPEG-XS)
原因一句话:
ITU-T + ISO 当年开会共识:
“RGB 留给显卡,YUV 留给传输”
六、FFmpeg 里你看到的那些 YUV 到底差在哪?
| pix_fmt | 含义 | 场景 |
|---|---|---|
| yuv420p | 最常用,UV 各 1/4 | 网络视频 |
| yuv422p | UV 横向减半 | ProRes / 广播 |
| yuv444p | 无色度下采 | 后期制作 |
| nv12 | UV 交错 | DXVA / VAAPI |
| yuv420p10le | 10bit | HDR / 电影感 |
RGB 只在出口才出现:
解码
↓
YUV420P
↓
sws_scale → RGB24 / RGBA
↓
QImage / SDL / OpenGL
七、一个你迟早会踩的坑:RGB 编码 ≠ 无损
你以为:
ffmpeg -i in.rgb -c:v libx264 rgb.mp4
是“原样”?
实际上:
-
FFmpeg → sws_scale → YUV420P(默认)
-
libx264 8bit 量化
-
chroma subsampling(不可逆)
真·无损路径是:
-c:v libx264rgb -pix_fmt rgb24
但是:
-
浏览器播不了
-
手机播不了
-
显卡不解
-
只有 ffmpeg → ffmpeg
所以没人这么干
八、一句话工程经验
FFmpeg 里永远用 YUV 干活,RGB 只在显示前一刻出现
正确生命周期:
摄像头 / Qt Image
↓
RGB → libswscale → YUV420P
↓
libx264 / NVENC
↓
MP4
↓
播放时 AVFrame → RGB → QOpenGLTexture
九、为什么你眼睛“看不出 YUV420 糊”
因为人眼视网膜中心:
-
视锥(色)≈ 5%
-
视杆(亮)≈ 95%
YUV420 本质是:
用 5% 的神经资源换 50% 带宽
这是生物学赢了工程的少数几次。
4万+

被折叠的 条评论
为什么被折叠?



