音视频修炼之视频基础(一):视频基础理论

视频基础理论 ------ 分辨率 / 帧率 / 码率 / Gamma / YUV

30 多篇 API 都讲了,回过头来补内功。这一篇把视频领域那些"老在用但没人说清"的术语彻底讲明白:分辨率、帧率、码率、隔行 vs 逐行、Gamma、YUV vs RGB、色域、采样定理。


本文速览

章节 阅读重点
0. 视频本质上是什么 把握本节核心概念和使用场景
1. 分辨率(Resolution) 把握本节核心概念和使用场景
2. 帧率(Frame Rate / FPS) 把握本节核心概念和使用场景
3. 码率(Bitrate) 把握本节核心概念和使用场景
4. 像素 → 颜色 → YUV vs RGB 把握本节核心概念和使用场景
5. Gamma ------ 一个被忽视的细节 把握本节核心概念和使用场景
6. 色域(Color Gamut) 把握本节核心概念和使用场景
7. 采样定理(Nyquist) 把握本节核心概念和使用场景
8. 隔行 vs 逐行(Interlaced vs Progressive) 把握本节核心概念和使用场景
9. 常见术语速查 把握本节核心概念和使用场景
后续章节 余下 2 节继续按"概念 → 示例 → 坑点 → 总结"展开

0. 视频本质上是什么

视频从"一张张图片"变成可播放文件,核心链路可以拆成 4 个连续问题:

阶段 核心问题 后续对应知识点
像素编码 像素值怎么存、分辨率怎么算、每帧有多少数据 分辨率、像素格式、采样
颜色表示 RGB / YUV 怎么表达颜色,人眼为什么更适合 YUV YUV vs RGB、色域、Gamma
帧内 / 帧间压缩 单帧怎么压缩,多帧之间怎么复用相似内容 编码器、I/P/B 帧、码率
码流封装 压缩后的音视频数据怎么组织成可播放文件 / 流 MP4 / FLV / HLS / DASH

一句话记忆 :视频工程的复杂度,基本都来自这条链路------像素怎么编码 → 颜色怎么表示 → 帧怎么压缩 → 流怎么封装


1. 分辨率(Resolution)

1.1 含义

分辨率 = 宽 × 高,单位是像素(pixel)。常见档次:

名称 分辨率 像素总数 备注
480p 854 × 480 ~40 万 SD
720p 1280 × 720 ~92 万 HD
1080p 1920 × 1080 ~200 万 FHD ⭐
2K 2560 × 1440 ~370 万 QHD
4K 3840 × 2160 ~830 万 UHD
8K 7680 × 4320 ~3300 万 ---

1.2 像素总数 = 计算量

分辨率 相对 1080p 计算量
1080p 基准
4K 4 倍计算量
8K 16× 16 倍计算量

分辨率翻倍 → 像素 4 倍 → 计算量 4 倍。这就是为啥 4K 比 1080p 难播 4 倍。

1.3 显示分辨率 ≠ 视频分辨率

屏幕跟视频分辨率经常对不上。比如手机屏 2400×1080,视频是 1920×1080------播放器要做 1920 → 2400 的横向缩放(插值),缩放算法的好坏直接影响画质。

1.4 为啥很多视频是 16:9

序号 要点
1 人眼水平视角 > 垂直视角,横屏更舒服
2 电视行业历史延续到现在,16:9 成了通用标准
3 竖屏 9:16 是手机时代的产物(短视频驱动)

2. 帧率(Frame Rate / FPS)

2.1 含义

帧率 = 每秒多少帧,单位 fps(frames per second)。

帧率 用途
24 fps 电影 ⭐(传统胶片标准)
25 fps PAL 制式(欧洲电视)
30 fps NTSC 制式(北美电视)/ 通用 ⭐
50/60 fps 高清电视 / 体育
60 fps 游戏直播 / 高质量录像
120 fps 慢镜头素材
240 fps 极慢镜头

2.2 为什么 24 fps 看着不卡

人眼有"视觉暂留",一帧停留约 100ms。临界点:

帧率 体感
≥ 16 fps 感觉是连续运动
≥ 24 fps 流畅(电影感)
≥ 60 fps 极流畅(运动模糊也减少)

24 fps 是"最低能接受的电影感"。低于这个会感觉一帧一帧的。

2.3 帧率不是越高越好

帧率提高带来两个连锁代价:

  • 数据量↑ → 码率↑ → 文件大 / 带宽贵
  • 解码 CPU↑ → 设备发热 / 功耗大

实战权衡:

场景 帧率
短视频 / 朋友圈 30 fps
电影 24 fps
体育直播 50/60 fps
游戏直播 60 fps
监控 15 fps(够用就好)
RTC 通话 15-30 fps

2.4 VFR vs CFR

类型 全称 特点 典型场景
CFR Constant Frame Rate 恒定帧率,每帧间隔严格相等 大多数普通视频 / 易处理
VFR Variable Frame Rate 可变帧率 屏幕录制 / 监控 / 难同步

VFR 的实战坑:FFmpeg 转码时容易出 PTS 乱跳,需要 -vsync cfr 强制转 CFR。


3. 码率(Bitrate)

3.1 含义

码率 = 每秒多少 bits 数据,单位 bps(bits per second)。

text 复制代码
1 Kbps = 1,000 bps
1 Mbps = 1,000,000 bps

不同码率档次的画质体感(H.264 编码):

码率 画质体感
500 Kbps 480p 还行
2 Mbps 720p 不错
4 Mbps 1080p 好
20 Mbps 4K 高质量

3.2 文件大小怎么算

text 复制代码
文件大小(字节)= 码率(bps)× 时长(秒)÷ 8

例:1080p 4Mbps 的 60 分钟视频:

text 复制代码
4_000_000 × 3600 ÷ 8 = 1.8 GB

码率确定 → 文件大小确定。这就是为啥短视频 App 要严格控制码率。

3.3 CBR / VBR / CRF 三种模式

模式 含义 优劣
CBR Constant 恒定码率 直播必备 / 文件大小可预测
VBR Variable 可变码率 复杂场景给高码率,简单场景省 / 文件大小不可预测
CRF Constant Rate Factor 恒定质量 x264 / x265 默认 / 用户感知最稳

简单选型原则:

说明
直播 / 流媒体 CBR
归档 / 离线 VBRCRF
不确定 CRF 23(x264 默认)

3.4 码率 vs 帧率 vs 分辨率的关系

三者任何一个上升,码率都跟着上升:

说明
分辨率↑ 每帧需要更多 bits → 码率↑
帧率↑ 帧总数变多 → 码率↑
画质要求↑ 每像素更多 bits → 码率↑

经验值(H.264 编码):

分辨率 30fps 60fps
720p 1.5-3 Mbps 3-5 Mbps
1080p 3-6 Mbps 6-10 Mbps
4K 15-25 Mbps 25-40 Mbps

4. 像素 → 颜色 → YUV vs RGB

4.1 RGB(屏幕用)

每个像素 = (R, G, B) 三个数。取值范围:8bit 是 0--255,10bit 是 0--1023。

举例:(255, 0, 0) = 纯红,(0, 255, 0) = 纯绿。

4.2 YUV(视频用 ⭐)

YUV 把"亮度"和"色彩"拆开:

说明
Y = 亮度(luminance)
U = 蓝色差(Cb)
V = 红色差(Cr)

转换公式(BT.601):

text 复制代码
Y =  0.299·R + 0.587·G + 0.114·B
U = -0.169·R - 0.331·G + 0.500·B + 128
V =  0.500·R - 0.419·G - 0.081·B + 128

4.3 为什么视频用 YUV 而不是 RGB

人眼对亮度(Y)敏感、对色彩(U/V)不敏感------这意味着 U/V 可以以更低分辨率存储而不被察觉。

YUV420 把 U/V 横纵都减半,同样画质,数据量比 RGB 少 50%。这就是 YUV420 是视频默认格式的根本原因。

4.4 YUV 子采样:4:4:4 / 4:2:2 / 4:2:0 / 4:1:1 / 4:0:0

子采样格式用 4:a:b 表示------在 4×2 像素块里,第 1 行采 a 个 UV 对、第 2 行采 b 个 UV 对。Y 永远全采。

格式 UV 减少 数据量 vs RGB 典型用途
4:4:4 不减 100%(=RGB) 影视后期、专业制作
4:2:2 横向减半 ~67% 广播电视、专业摄像
4:2:0 横纵都减半 50% 视频默认(H.264/H.265/JPEG)
4:1:1 横向减 1/4 50% 老 DV 格式
4:0:0 无 UV 33%(仅 Y) 黑白视频

核心数据节省:4:2:0 让 4 个像素共用 1 对 UV,每像素 1.5 字节(Y + 0.25U + 0.25V),相比 RGB 的 3 字节/像素省一半。这就是"用人眼对色彩不敏感"换数据量。

4.4.1 Planar / Semi-Planar / Packed ------ 内存里怎么排

同样是 YUV 4:2:0,内存排布有 3 种 ------这就是为什么有 YUV420PYUV420SP 之分:

Planar(带 P 后缀):Y / U / V 三平面分开
格式名 别名 排布 谁在用
I420 YUV420P [Y...] [U...] [V...] FFmpeg 默认、x264/x265 输入
YV12 YUV420P [Y...] [V...] [U...](U/V 顺序对调) 部分老格式 / DirectShow
Semi-Planar(SP 后缀):Y 单平面,U/V 交错
格式名 排布 谁在用
NV12 [Y...] [UVUVUV...] Android MediaCodec、Intel QSV、Apple VideoToolbox
NV21 [Y...] [VUVUVU...](U/V 交错顺序对调) Android Camera 默认输出
Packed:Y/U/V 完全交错(4:2:2 才有)
格式名 排布 谁在用
YUY2 / YUYV [YUYVYUYV...] 部分摄像头、Windows DirectShow
4.4.2 "YUV420" 跟 "YUV420P" 区别
说明
YUV420 是"4:2:0 子采样"的抽象描述,不指定内存排布。光说"YUV420"还不够,对方不知道你给的是 I420 / NV12 还是 NV21
YUV420P 明确指 Planar 排布(= I420 / YV12)
YUV420SP 明确指 Semi-Planar 排布(= NV12 / NV21)

实战经验

说明
跟 FFmpeg 打交道 默认 I420(YUV420P)
跟 Android Camera 打交道 默认 NV21
跟 Android MediaCodec 打交道 大概率是 NV12 (但有些机器返回 I420,必须先 query MediaFormat.KEY_COLOR_FORMAT
跟 iOS VideoToolbox NV12(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange)

写代码时一定要确认是哪种------拿错格式,颜色全错(蓝绿翻转、紫色花屏、整体偏色都是这个原因)。


5. Gamma ------ 一个被忽视的细节

5.1 问题

线性传输有 mismatch:

序号 要点
1 摄像机捕获的是线性光强
2 人眼感知是非线性(对暗部敏感)
3 显示器响应也是非线性

如果直接传线性数据到屏幕,暗部细节会大量丢失

5.2 Gamma 校正

通过两次幂运算"绕弯":编码时压暗部、解码时复原。Gamma 通常取 2.2。

text 复制代码
store_value   = pow(linear, 1/2.2)       // 编码 (压暗)
display_value = pow(store_value, 2.2)    // 显示 (反向)

5.3 为什么这么干

8bit 整数只有 256 级。线性存储下,暗部只能用 1--30、亮部却用了 31--255------大部分位深给了人眼不敏感的亮部,浪费。

Gamma 后,暗部用 1--128、亮部用 128--255,人眼看上去更"均匀",暗部细节肉眼可辨。

5.4 视频开发中的体现

不同视频源用不同 gamma 曲线,显示前要做 transfer function 转换:

标准 用途
sRGB 标准显示 gamma
BT.709 HD 视频 gamma
BT.2020 UHD 视频 gamma
PQ HDR(完全不同的曲线)
HLG HDR(折中)

这就是 HDR 涉及的 transfer characteristics。第 1.4 篇细讲。


6. 色域(Color Gamut)

6.1 含义

色域 = 能表达的颜色范围(在 CIE 1931 色度图上的覆盖区域)。

主流色域:

色域 用途 覆盖度
sRGB 标准 web / 显示器 普通
BT.709 HD 视频 ⭐ 与 sRGB 接近
Display P3 iPhone / Mac 比 sRGB 大 25%
DCI-P3 数字电影 同上
BT.2020 UHD / HDR ⭐⭐ 比 sRGB 大 80%

6.2 为什么色域重要

  • 窄色域 → 拍出的红色不够红(饱和度上限低)
  • 宽色域 → 颜色范围更广,HDR 必备

第 1.4 篇专题讲。


7. 采样定理(Nyquist)

7.1 定理

要无失真地采样一个信号,采样率必须 ≥ 信号最高频率的 2 倍

7.2 应用

7.2.1 音频
序号 要点
1 人耳能听 20Hz -- 20kHz
2 采样率必须 ≥ 40kHz
3 所以 CD 用 44.1kHz、视频音轨用 48kHz
7.2.2 视频帧率

"运动"也是一种"频率":

  • 帧率太低 → 运动失真(走路看着像跳)
  • 24 fps ≈ 12Hz 上限(够用,因为有运动模糊掩盖)
7.2.3 抗混叠(Anti-aliasing)

缩放视频时,高频细节超过采样率会出现摩尔纹。解决方法 :缩放前做低通滤波(sws_scale 用的算法就是这个原理)。


8. 隔行 vs 逐行(Interlaced vs Progressive)

8.1 隔行扫描(1080i)

i 表示 interlaced。每"次"扫一半(一个 field):奇数行 → 偶数行 → 奇数行......每秒 50 fields = 25 frames。老 CRT 电视用这个,目的是减少闪烁。

8.2 逐行扫描(1080p) ⭐

p 表示 progressive。每"次"扫整帧。数字时代的主流

8.3 隔行的问题

处理隔行视频时,必须先做 deinterlace(去交错),否则运动场景会出现"梳子状"(combing effect)伪影。

FFmpeg 处理:

bash 复制代码
ffmpeg -i interlaced.ts -vf yadif=1 progressive.mp4

yadif 是常用的去交错滤镜。


9. 常见术语速查

术语 含义
Aspect Ratio 宽高比(16:9 / 4:3 / 9:16)
Pixel Aspect Ratio 像素的宽高比(一般 1:1,DV 是 1.07)
Stride / Pitch 每行字节数(含对齐 padding)
GOP I 帧 + 跟它的所有 P/B 帧(参考 1.3 篇)
Profile 编码器档次(Baseline / Main / High)
Level 编码参数限制(4.1 / 5.0)
HDR 高动态范围
HLG / PQ HDR 的 transfer function
DCT 离散余弦变换(编码器内部)
Macroblock 宏块(H.264 编码的基本单位 16×16)
CTU Coding Tree Unit(H.265 编码单位 64×64)

10. 计算示例:1080p 60fps 4Mbps H.264 视频

这个例子重点不是背公式,而是建立一个直觉:未压缩视频是 Gbps 级别,编码后才会降到 Mbps 级别

10.1 基础参数

项目 数值 说明
分辨率 1920 × 1080 每帧约 207 万像素
帧率 60 fps 每秒 60 帧
像素吞吐 1920 × 1080 × 60 ≈ 1.24 亿像素/秒 后续所有码率计算都从这里出发
目标码率 4 Mbps H.264 编码后的网络 / 文件码率

10.2 未压缩码率 vs H.264 目标码率

数据形态 每像素 bit 数 计算方式 结果 直觉
RGB888 原始帧 24 bit/pixel 1.24 亿 × 24 ≈ 2.99 Gbps 屏幕显示友好,但直接存 / 传输基本不可接受
YUV420 原始帧 12 bit/pixel 1.24 亿 × 12 ≈ 1.49 Gbps 已经比 RGB 省一半,但仍然远大于网络视频码率
H.264 编码后 由码控决定 目标码率直接约束 4 Mbps = 0.004 Gbps 通过帧内 / 帧间压缩,把数据量压到可传输范围

10.3 压缩比怎么算

对比口径 公式 压缩比 说明
按 YUV420 原始数据算 1492.99 Mbps ÷ 4 Mbps ≈ 373 倍 更贴近编码器输入,因为 H.264 通常吃 YUV420
按 RGB888 原始数据算 2985.98 Mbps ÷ 4 Mbps ≈ 746 倍 更适合向非视频同学解释"从屏幕像素到网络码率"的跨度

一句话总结 :H.264 的价值不是把 4Mbps 变得"更小",而是把 1.5Gbps 级别的原始 YUV 视频 压到 4Mbps 级别,并尽量让人眼看不出明显损失。


11. 总结

视频基础的"知识框架":

金句:视频领域 80% 的术语都跟"采样 + 压缩"有关。理解了 YUV 子采样为啥能省一半数据、Gamma 为啥要校正、码率/分辨率/帧率三角关系,剩下的细节都是这些原则的展开。

相关推荐
一拳一个呆瓜20 小时前
【STL】iostream 编程:输入流成员函数
c++·stl
小小勇气大爆发20 小时前
Android17适配总结
android
数字会议深科技20 小时前
自主音视频会议核心技术沉淀:两项发明专利赋能专业会务设备稳健运行
人工智能·音视频·音频·国际会议·会议解决方案·会议讨论系统·高端会议
xiaoye-duck21 小时前
《Linux系统编程》Linux 系统多线程(七): C++ 线程安全日志系统封装:基于策略模式解耦,兼容 glog 使用风格
linux·c++·日志系统
开源推荐官21 小时前
getInvoice 是回填不是开票,Tigshop开源商城发票接口理一理
android·开源·php
2zcode21 小时前
抑郁症多模态音视频与脑电信号数据集
音视频·情绪识别·抑郁症·心理健康分析
醉城夜风~21 小时前
HTML表单域学习博客:表单标签、输入框、按钮详解
android·java·缓存
程序喵大人1 天前
【C++进阶】STL容器与迭代器 - 07 迭代器是容器和算法之间的通用游标
开发语言·c++·算法
汉克老师1 天前
GESP2026年3月认证C++七级( 第三部分编程题(1、拆分))精讲
c++·预处理·dp·取模·gesp7级·数学规律·对数
BerryS3N1 天前
C++在AI时代的核心力量:从底层加速到大规模大模型推理引擎的高能实践
开发语言·c++·人工智能