Skip to main content
  1. posts/

Audio and video learning

音视频学习
#

攻克视频技术
#

李江 - 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值?

帧内预测
#

宏块 和 子块

块类型帧内预测模式
亮度 4x49种:8方向 + DC
亮度 16x164种:3方向 + DC
色度8x84种: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 变换系数熵编码

网络视频层

编解码并行处理

率失真优化

速率控制