音视频学习(一百零五):Access Unit (AU)和RTP分包

一、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 是封装和传输的基本单位

  1. RTP 传输:每个 AU 需要被分包成一个或多个 RTP 包
  2. 时间同步:通过 AU 的时间戳实现音视频同步
  3. 丢包恢复:AU 边界清晰,便于错误恢复和重传策略
  4. 缓冲管理:接收端以 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 为什么需要分包

  1. MTU 限制:网络最大传输单元通常为 1500 字节(以太网),超过需要分包
  2. 实时性要求:大包传输延迟高,分包可以降低传输延迟
  3. 丢包影响:小包丢失影响范围小,便于错误恢复

三、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)

策略

  1. 参数集(SPS/PPS)→ STAP-A 聚合
  2. 小 Slice → Single NAL
  3. 大 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 流

    bash 复制代码
    ffmpeg -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 分包是音视频流媒体传输的核心技术:

  1. AU 是编解码的基本单位,保证了数据的独立性和完整性
  2. RTP 分包 需要根据场景选择合适的模式:
    • 单包模式:小 NAL,低开销
    • 分片模式(FU):大 NAL,必选
    • 聚合模式(AP):多小 NAL,减少包数
  3. 实际应用 中需要综合考虑延迟、带宽、丢包率等因素

掌握这些技术,是构建高质量流媒体系统的基础。


参考资料

  • 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
相关推荐
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】Gemini模型接入知识体系
java·开发语言·网络·人工智能·网络协议·学习·http
传奇开心果编程1 小时前
【Rust入门知识点学与练】第13课:枚举 Enum
开发语言·学习·rust
刘广睿1 小时前
AI 配音怎么做?语音合成 TTS 技术选型与本地部署实战(edge-tts / GPT-SoVITS / CosyVoice / Piper)
人工智能·音视频·效率工具·语音合成·tts
小柯南敲键盘1 小时前
跨马翻译AI工具,批量图片视频翻译与智能抠图一站式解决
人工智能·python·音视频
火眼金睛炼单词2 小时前
零基础高效记忆单词:小程序学习法的完整实操指南
学习·小程序
山岚的运维笔记2 小时前
mysql 专业笔记 -- 第 14 章:GROUP BY
运维·数据库·笔记·后端·学习·mysql·dba
阳光宅男@李光熠3 小时前
【电子通识】PCB外观检查机AVI(Automated Visual Inspection)
笔记·学习
show4333 小时前
2026小程序端视频处理性能优化:批量+120分钟大文件
性能优化·音视频