音视频学习#
攻克视频技术#
李江 - 2021
像素
分辨率
位深
跨距 Stride
帧率
码率
颜色空间
RGB
YUV
- 常用类型 4:4:4, 4:2:2, 4:2:0
- 存储格式:Planar格式;Packed格式
转换
- 转换标准 BT601,BT709
- Color Range(Full Range or Limited Range)
缩放算法
基本原理
常用算法
- 最近临插值 Nearest
- 双线性插值 Bilinear
- 双三次插值 Bicubic
编解码#
帧内预测 - 空间冗余
帧间预测 - 时间冗余
频域变换 - 视觉冗余
量化 - 视觉冗余
- 量化步长 QStep(用户配置量化参数 QP)
熵编码 - 信息熵冗余
- 行程编码
编码器
- H264
- H265
- AV1
码流结构#
帧类型
I 帧
- 特殊的I帧:IDR(Instant Decoding Refresh)帧
P 帧
B 帧
GOP(Group of Pictures,图像组)
-
Slice (片)
H264的码流格式
封装格式
- AnnexB 格式
- AVCC 格式
NALU (Network Abstraction Layer Unit,网络抽象层单元)
SPS 序列参数集
PPS 图像参数集
I Slice、P Slice、B Slice(只区分了 IDR Slice和非IDR Slice,具体类型需要解析Slice Header)
IDR Slice
具体结构
- Header:1字节,
- Data:对于Slice数据,其又分为 Slice Header + Slice Data
常见工程问题
- 多Slice时如何判断哪几个Slice是同一帧的?
- 如何从SPS中获取图像的宽高?
- 如何计算得到QP值?
帧内预测#
宏块 和 子块
| 块类型 | 帧内预测模式 |
|---|---|
| 亮度 4x4 | 9种:8方向 + DC |
| 亮度 16x16 | 4种:3方向 + DC |
| 色度8x8 | 4种:3方向 + DC |
| 预测模式的选择 |
- cost
- 率失真优化
帧间预测#
单参考 和 多参考
前向参考 和 双向参考
H264的帧间编码
块大小
参考帧 和 运动矢量
运动搜索
- 全搜索
- 三步搜索(H261、MPEG-1)
- 菱形搜索(H263)
- 六边形搜索(H264的可选模式,如16x16宏块)
- 非对称十字六边形搜索(H264的高效模式,如8x8、4x4子块搜索,H265的基础搜索)
- 分层运动搜索(H265的多层搜索)
匹配准则
- SAD 绝对值之和
- SATD 变换域绝对差之和
- SSd 平方差之和
亚像素插值 与 亚像素精度运动搜索
运动矢量的编码
- 预测运动矢量 MVP
- 运动矢量残差 MVD
- SKIP模式特例 MVD=(0,0) & 残差块=0
梳理P帧宏块的帧间模式的选择
- 参考帧、运动矢量、块划分、SKIP模式
变换 与 量化#
常规视频编码中的DCT变化和量化
DCT变换
Hadamard变换
H264种的DCT变换和量化
RTP & RTCP#
Real-time Transport Protocol,实时传输协议
Real-time Transport Control Protocol,实时传输控制协议
H264的RTP打包
单NALU封包
- 去除NALU数据前面的起始码
- RTP Header + NALU(NALU Header + NALU Data)
- 适合单个RTP包小于1500字节(MTU大小),比如P帧和B帧的码流
组合封包
- 多个NALU放置在一个RTP包中
- RTP Header + STAP-A Header + size 字段 + NALU(Header + Data) + size 字段 + NALU
- 适合单个NALU很小的情形
分片封包
- 一个NALU分开打包在连续的多个RTP包中
- RTP Header + FU Indicator + FU Header + NALU Fragment
- 适合打包后大于1500字节的时候,较为经常使用
带宽预测#
网络设备:
较大缓存 - > 延时加大 -> 基于延时的带宽预测
没有/较小缓存 -> 高丢包 -> 基于丢包的带宽预测
基于延时的带宽预测
核心思路:通过计算一组RTP包的发送时长和接收时长,判断延时变化趋势,调整预测带宽值
- 计算延时
- 延时变化的趋势计算
- 网络状态判断
- 带宽调整更新
基于丢包的带宽预测
核心思路:根据Transport- CC报文反馈的信息计算丢包率,根据丢包率直接更新带宽
- 丢包率的计算
- 带宽调整
最大带宽探测算法
码控算法#
编码大小 <- 画面复杂度 + QP值
目标是选择合适的QP值以控制编码后码流的大小
码控算法的类型
- VBR(动态码率)保证视频画面质量,适合视频点播和短视频场景
- CQP(恒定QP)一般用来衡量编码算法的性能,实际工程不使用
- CRF(恒定码率因子)x264默认码控算法,自适应调整QP
- CBR(恒定码率)适用于RTC场景,码率与带宽接近
CBR算法
分 帧组级、帧级、宏块组GOM级 进行调整QP
- 先确定帧组(连续的若干帧,一般8帧作为一组)的输出尽量接近目标码率
- 确定组内的每一帧分配大小(称为目标帧大小)
- 根据目标帧大小,确定帧级的QP值
- 确定帧内的宏块组(连续的几行宏块作为一组,一般选4行宏块)分配多少大小
- 最后确定宏块的QP值
复杂度求解
I帧 帧内预测 用“方差”预测复杂度
求每个宏块的方差,最后将帧的所有宏块的方差之和作为帧的复杂度
P帧 帧间预测 用当前帧宏块减去参考帧宏块的SAD值之和作为帧的复杂度
帧组级
帧级
宏块组级
JitterBuffer & 卡顿问题 & 花屏问题#
卡顿问题#
分析采集到渲染的链路
![[Pasted image 20250903085100.png]]
采集或设置的帧率不够
前处理(缩放、增强、美颜)或编码(码控、预测、变换、量化、熵编码)耗时太长
编码器输出码率超过实际网络带宽
复杂帧或I帧编码后过大,较多RTP包同时发送
- 可以在编码打包之后、发送之前,增加一个平滑发送模块(Paced Sender)
网络环境本身带有一定的丢包率
- 丢包重传–》JitterBuffer
- I帧请求
花屏问题#
- 帧不完整
- 参考帧不完整
- YUV格式渲染问题
- Stride问题
SVC#
为什么需要SVC
什么是SVC
时域SVC
- 调整参考帧结构实现分层编码
- 缺点:跨帧参考压缩率有一定的下降
空域SVC
- 一般标准不支持空域SVC,除了扩展
- 常使用多个编码器编码多种分辨率代替空域SVC
具体实现时域SVC
MP4 & FLV#
FLV#
MP4#
- MP4由一个个box组成,每个box存放了不同的数据,且box内可嵌套着box
- 最外层box主要有三个:File Type box(ftyp box),Movie box(moov box),Media Data box(mdat box)
sample、chunk、track
音画同步#
时间戳体系
- RTP时间戳
- PTS(Presentation Time Stamp)
- DTS(Decoding Time Stamp)
- e.g. MP4文件通过moov盒中的trak(轨道)信息存储PTS/DTS,播放器解析后按时间戳顺序渲染。
时间基
- RTP时间戳的时间基是1/90000s
- FLV 1/1000s
- MP4 box中的time_scale
同步的类型
- 视频同步到音频(比较常用、参考FFplay)
- 音频同步到视频
- 音频和视频都做调整同步(WebRTC)
FFplay中的视频同步到音频
计算视频时钟和音频时钟之间的差值diff,调整当前播放视频帧的播放时间 last_duration
- 如果 diff > 0,则加大 last_duration
- 如果 diff < 0,则减小 last_duration
快手 · 音视频技术入门#
刘歧 - 2022
快手 · 移动端音视频开发实战#
展晓凯 - 2022
H.264/AVC#
毕厚杰 《新一代视频压缩标准 –H.264/AVC》2004
Chap3. 视频压缩编码的基本原理
Chap6. H.264/AVC 编码器原理
6.3 结构
名词解释
档次和级
编码数据格式
参数图像
片和片组
6.4 帧内预测
4x4 亮度预测模式
16x16 亮度预测模式
8x8 色度块预测模式
信号化帧内预测模式
6.5 帧间预测
树状结构运动补偿
运动矢量
MV 预测
B 片预测
加权预测
6.6 SP/SI帧技术
6.7 整数变换与量化
6.8 CAVLC(基于上下文自适应的可变长编码)
6.9 CABAC(基于上下文自适应的二进制算术编码)
6.10 码率控制
6.11 去方块滤波
6.12 其余特征
参考图像管理
重排序
隔行视频
数据分割片
H.264传输
Chap8. H.264/AVC 解码器的原理和实现
Chap9. H.264视频编码传输的QoS
H.265/HEVC#
万帅 杨付正 《新一代高效视频编码 H.265/HEVC 原理、标准与实现》2014
绪论
数字视频格式
编码结构
预测编码
4.1 预测编码技术
4.2 帧内预测
4.3 帧间预测
4.4 PCM模式及相关语法语义
变换编码
5.1 离散余弦变换
5.2 离散正弦变换
5.3 变换结构
5.4 哈达码变换
量化
6.1 标量量化
6.2 H.265/HEVC中的量化
环路后处理
7.1 去方块滤波
7.2 样点自适应补偿
SAO技术
SAO的实现方法
语法语义
熵编码
8.1 基本原理
8.2 零阶指数哥伦布编码及其应用
8.3 CABAC
8.4 变换系数熵编码
网络视频层
编解码并行处理
率失真优化
速率控制
