AV1 码流 RTP 封装

张开发
2026/4/9 2:18:15 15 分钟阅读

分享文章

AV1 码流 RTP 封装
注近期文章均来自我的个人笔记现在公开到博客上。如果有错误欢迎指正。一、整体码流结构012301234567890123456789012345678901--------------------------------|V2|P|X|CC|M|PT|sequence number|--------------------------------|timestamp|--------------------------------|synchronizationsource(SSRC)identifier||contributingsource(CSRC)identifiers||....||0x100|0x0|extensions length||ID|hdr_length||||||dependencydescriptor(hdr_length #bytes)||||----------------||Other rtp header extensions...||AV1aggr hdr||--------||||Bytes2..NofAV1payload||||----------------|:OPTIONALRTPpadding|--------------------------------关键说明RTP 包的 Payload Type 可以由 SDP 协商决定Dependency Descriptor 扩展头非必须但是 WebRTC 在使用 AV1 时是强制启用的。原因是缺少该扩展头的话无法区分 SVC 编码中不同的时域帧和空域帧Aggregation header位于 RTP 头 扩展头之后的第一个字节。官方文档并没有说明是否必须使用但是在 WebRTC 的实现中是每个包都会加的WebRTC 打包说明以下 3 种 OBU 类型会被丢弃OBU_TEMPORAL_DELIMITEROBU_TILE_LISTOBU_PADDINGWebRTC 打包代码位于src\modules\rtp_rtcp\source\rtp_packetizer_av1.ccsrc\modules\rtp_rtcp\source\rtp_packetizer_av1.h二、Dependency Descriptor 扩展头结构SVC 编码时需要用到后续的 《SVC 编码技术》 再介绍三、Aggregation Header占用一个字节结构如下01234567--------|Z|Y|W|N|-|-|-|--------字段说明比特位字段说明bit 0Z如果当前 RTP 包的第一个 OBU 是前一个 RTP 包中 OBU 的延续部分则设置为 1否则为 0bit 1Y如果当前 RTP 包的最后一个 OBU 是一个片段且将在下一个 RTP 包中继续则设置为 1否则为 0bits 2-3W表示当前 RTP 包中包含的 OBU 元素的数量bit 4N如果当前 RTP 包是一个编码视频序列coded video sequence的第一个包则设置为 1否则为 0W 位详细说明如果设置为0则每个 OBU 元素前必须有一个长度字段超过 3 个则固定设为 0如果设置为非 0 值即1、2 或 3则最后一个 OBU 元素前不应有长度字段其长度可通过以下方式计算最后一个 OBU 的长度 RTP Payload 的总长度 - Aggregation Header 的长度 - 前面所有 OBU包括其长度字段的总长度非 0 时读取长度字段的次数 W - 1次例如W 1 时表示只有一个 OBU 元素并且读取 1 - 1 0 次长度字段也就是 Aggregation header 之后直接为 OBU 元素数据W 位设置示例示例 1W 0每个 OBU 前都有长度字段012301234567890123456789012345678901--------------------------------|Z|Y|00|N|-|-|-|OBUelement1size(leb128)||------------------------|:::OBUelement1data:::|||----------------||OBUelement2size(leb128)|--------------------------------:::OBUelement2data:::||--------------------------------:::...:::--------------------------------|OBUe...Nsize||--------OBUelementNdata--------||------------------------示例 2W 2最后一个 OBU 前无长度字段012301234567890123456789012345678901--------------------------------|Z|Y|10|N|-|-|-|OBUelement1size(leb128)||------------------------|||:::OBUelement1data:::|||----------------|||----------------|||:::OBUelement2data:::||--------------------------------注W b10 2leb128格式见上篇《AV1 视频编码技术》封装示例单个 OBU 封装示例-Z0不是前一个包的延续-Y0OBU不会在下一个包中继续-W1包含一个OBU元素-N1如果是编码视频序列的第一个包如 Sequence HeaderOBU多个 OBU 封装示例-Z0不是前一个包的延续-Y0OBU不会在下一个包中继续-W2包含2个OBU元素-N1如果是编码视频序列的第一个包如 Sequence HeaderOBUFrame HeaderOBU合封时设置为1OBU 分片封装示例第一个分片-Z0不是前一个包的延续-Y1OBU将在下一个包中继续-W1包含一个OBU元素-N0不是编码视频序列的第一个包 Aggregation Header01111000即0x78中间分片-Z1是前一个包的延续-Y1OBU将在下一个包中继续-W1包含一个OBU元素-N0不是编码视频序列的第一个包 Aggregation Header11101000即0xE8最后一个分片-Z1是前一个包的延续-Y0OBU不会在下一个包中继续-W1包含一个OBU元素-N0不是编码视频序列的第一个包四、参考文档AV1 RTP 封装规范

更多文章