一、Access Unit (AU) 概述
1.1 什么是 Access Unit
Access Unit(访问单元,简称 AU)是音视频编码标准中的一个基本概念,代表编码数据流中可以被独立解码和呈现的最小单元。
在不同的编解码标准中,AU 的具体含义略有差异:
- H.264/AVC & H.265/HEVC :一个 AU 通常包含一帧完整的视频图像所需的所有 NAL 单元(包括 SPS、PPS、SEI、Slice 等)
- AAC 音频 :一个 AU 对应一个音频帧,包含 1024 或 960 个音频采样点
- MPEG-4:AU 是可以独立解码的编码对象单元
1.2 AU 的重要特性
┌─────────────────────────────────────┐
│ Access Unit (AU) │
├─────────────────────────────────────┤
│ • 独立解码 │
│ • 完整呈现时间戳 (PTS/DTS) │
│ • 可能包含多个 NAL 单元 │
│ • 边界明确 │
└─────────────────────────────────────┘
关键属性:
- PTS (Presentation Time Stamp):呈现时间戳,指示该 AU 何时显示
- DTS (Decoding Time Stamp):解码时间戳,指示该 AU 何时解码
- 完整性:AU 必须完整传输才能被正确解码
1.3 AU 在流媒体传输中的意义
在流媒体传输场景中,AU 是封装和传输的基本单位:
- RTP 传输:每个 AU 需要被分包成一个或多个 RTP 包
- 时间同步:通过 AU 的时间戳实现音视频同步
- 丢包恢复:AU 边界清晰,便于错误恢复和重传策略
- 缓冲管理:接收端以 AU 为单位进行缓冲和播放控制
二、RTP 协议基础
2.1 RTP 简介
RTP (Real-time Transport Protocol) 是互联网上传输实时数据(如音频、视频)的标准协议。
┌──────────────────────────────────────────┐
│ RTP Packet Header │
├──────────────────────────────────────────┤
│ V(2) | P(1) | X(1) | CC(4) | M(1) | PT(7)│
│ Sequence Number (16) │
│ Timestamp (32) │
│ SSRC Identifier (32) │
│ Payload (variable) │
└──────────────────────────────────────────┘
关键字段:
- Sequence Number:包序号,用于检测丢包和乱序
- Timestamp:采样时间戳,用于同步和抖动消除
- M (Marker) bit:标记位,通常用于标识帧边界
- PT (Payload Type):载荷类型,指示编码格式
2.2 为什么需要分包
- MTU 限制:网络最大传输单元通常为 1500 字节(以太网),超过需要分包
- 实时性要求:大包传输延迟高,分包可以降低传输延迟
- 丢包影响:小包丢失影响范围小,便于错误恢复
三、RTP 分包的主要方式
3.1 单 NAL 单元模式(Single NAL Unit Mode)
适用场景:NAL 单元小于 MTU 时,直接封装
┌─────────────────────────────────────┐
│ RTP Header (12 bytes) │
├─────────────────────────────────────┤
│ NAL Header (1 byte) │
├─────────────────────────────────────┤
│ NAL Payload │
└─────────────────────────────────────┘
特点:
- ✅ 简单高效,无额外开销
- ✅ 适合小尺寸 NAL(如 SPS、PPS、小 Slice)
- ❌ 不适合大帧(如 I 帧)
典型应用:
- 低分辨率视频流(320x240)
- 参数集传输(SPS/PPS)
- 音频帧传输
3.2 分片单元模式(Fragmentation Unit - FU)
适用场景:单个 NAL 单元超过 MTU,需要拆分成多个 RTP 包
3.2.1 FU-A 模式(H.264)
First Packet:
┌─────────────────────────────────────┐
│ RTP Header (M=0) │
├─────────────────────────────────────┤
│ FU Indicator (Type=28) │
├─────────────────────────────────────┤
│ FU Header (S=1, E=0, Type=slice) │
├─────────────────────────────────────┤
│ NAL Payload Fragment 1 │
└─────────────────────────────────────┘
Middle Packets:
┌─────────────────────────────────────┐
│ RTP Header (M=0) │
├─────────────────────────────────────┤
│ FU Indicator (Type=28) │
├─────────────────────────────────────┤
│ FU Header (S=0, E=0, Type=slice) │
├─────────────────────────────────────┤
│ NAL Payload Fragment N │
└─────────────────────────────────────┘
Last Packet:
┌─────────────────────────────────────┐
│ RTP Header (M=1) │ ← Marker bit 标记结束
├─────────────────────────────────────┤
│ FU Indicator (Type=28) │
├─────────────────────────────────────┤
│ FU Header (S=0, E=1, Type=slice) │ ← End bit 标记最后片段
├─────────────────────────────────────┤
│ NAL Payload Fragment Last │
└─────────────────────────────────────┘
FU Header 字段:
- S (Start) bit:首包标志
- E (End) bit:尾包标志
- R (Reserved) bit:保留
- Type (5 bits):原始 NAL 单元类型
特点:
- ✅ 支持任意大小 NAL 单元的分片
- ✅ 接收端可根据 S/E 标志重组
- ✅ 适用于高清视频流
- ⚠️ 丢失中间包会导致整个 NAL 单元不可用
典型应用:
- 1080p/4K 高清视频直播
- I 帧传输(通常几十到几百 KB)
3.3 聚合包模式(Aggregation Packet - AP)
适用场景:多个小 NAL 单元合并到一个 RTP 包中,减少包头开销
3.3.1 STAP-A(Single Time Aggregation Packet)
┌─────────────────────────────────────┐
│ RTP Header │
├─────────────────────────────────────┤
│ STAP-A NAL Header (Type=24) │
├─────────────────────────────────────┤
│ NAL Size 1 (2 bytes) │
│ NAL Unit 1 (SPS) │
├─────────────────────────────────────┤
│ NAL Size 2 (2 bytes) │
│ NAL Unit 2 (PPS) │
├─────────────────────────────────────┤
│ NAL Size 3 (2 bytes) │
│ NAL Unit 3 (SEI) │
└─────────────────────────────────────┘
特点:
- ✅ 减少 RTP 包数量,降低网络开销
- ✅ 适合聚合 SPS、PPS、SEI 等小 NAL
- ❌ 要求所有 NAL 具有相同时间戳
- ⚠️ 单包丢失会影响多个 NAL
典型应用:
- 视频流初始化(发送 SPS+PPS)
- 低码率场景下的小 slice 聚合
3.4 混合模式(组合使用)
实际应用中,常常混合使用以上模式:
AU (一帧视频)
├── SPS (小) ────────────> Single NAL Mode (RTP 1)
├── PPS (小) ────────────> STAP-A (RTP 2)
├── SEI (小) ────────────> STAP-A (RTP 2)
└── Slice (大) ──────────> FU-A (RTP 3~10)
策略:
- 参数集(SPS/PPS)→ STAP-A 聚合
- 小 Slice → Single NAL
- 大 Slice/I 帧 → FU-A 分片
四、不同场景下的分包策略
4.1 低延迟直播(延迟 < 500ms)
需求:极低延迟,容忍少量丢包
策略:
- 优先使用 FU-A:尽快发送,不等待聚合
- 小 MTU(1200 字节):减少单包传输时间
- 无缓冲:接收端立即解码
- 允许跳帧:丢包时跳过当前帧
典型应用:视频会议、云游戏、远程控制
4.2 高质量直播(延迟 2-5 秒)
需求:画质优先,允许适度延迟
策略:
- 混合模式:小 NAL 聚合,大 NAL 分片
- 标准 MTU(1400 字节)
- 接收端缓冲(2-3 秒):平滑抖动和丢包
- FEC/重传:纠错码或 NACK 重传
典型应用:体育赛事直播、音乐会直播
4.3 点播流媒体(HLS/DASH)
需求:稳定传输,支持切换码率
策略:
- TCP + HTTP:不使用 RTP,直接传输完整 AU
- 切片传输(TS/fMP4):每个切片包含若干完整 AU
- 自适应码率:根据网络动态调整
典型应用:YouTube、Netflix、爱优腾
4.4 弱网环境(移动网络)
需求:抗丢包,自适应
策略:
- 小包策略(800-1000 字节):降低单包丢失影响
- 冗余编码(FEC):RS 码、喷泉码
- 关键帧保护:I 帧多路径传输
- 动态码率调整:SVC/分层编码
典型应用:移动直播、车载视频
五、分包实现的关键要点
5.1 NAL 单元边界检测
需要解析 Annex B 格式(Start Code)或 AVCC 格式(Length Prefix):
c
// Annex B: 0x00 0x00 0x00 0x01 或 0x00 0x00 0x01
// AVCC: [4 bytes length][NAL data]
5.2 Marker Bit 的设置
- Video:每个 AU 的最后一个 RTP 包设置 M=1
- Audio:每个音频帧对应的 RTP 包设置 M=1
5.3 时间戳计算
RTP Timestamp = PTS × (RTP Clock Rate / 时基)
示例(H.264,时钟频率 90000Hz,帧率 30fps):
Frame 1: TS = 0
Frame 2: TS = 3000 (90000/30)
Frame 3: TS = 6000
5.4 序列号管理
- 每发送一个 RTP 包,序列号加 1
- 循环使用(0~65535)
- 接收端据此检测丢包和乱序
六、工具与调试
6.1 常用工具
-
Wireshark:抓包分析 RTP 流
-
FFmpeg:生成和解析 RTP 流
bashffmpeg -re -i input.mp4 -c:v libx264 -f rtp rtp://192.168.1.100:5004 -
VLC:接收和播放 RTP 流
-
GStreamer:灵活的流媒体框架
6.2 性能指标
| 指标 | 说明 | 目标值 |
|---|---|---|
| 丢包率 | 丢失包占比 | < 1% |
| 抖动 | 包到达时间差异 | < 30ms |
| 端到端延迟 | 采集到播放 | < 500ms(低延迟) |
| 码率 | 单位时间数据量 | 自适应 |
七、总结
Access Unit 和 RTP 分包是音视频流媒体传输的核心技术:
- AU 是编解码的基本单位,保证了数据的独立性和完整性
- RTP 分包 需要根据场景选择合适的模式:
- 单包模式:小 NAL,低开销
- 分片模式(FU):大 NAL,必选
- 聚合模式(AP):多小 NAL,减少包数
- 实际应用 中需要综合考虑延迟、带宽、丢包率等因素
掌握这些技术,是构建高质量流媒体系统的基础。
参考资料:
- RFC 3550 - RTP: A Transport Protocol for Real-Time Applications
- RFC 6184 - RTP Payload Format for H.264 Video
- RFC 7798 - RTP Payload Format for H.265/HEVC Video