音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言

《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式,这两个文档都可以从RFC官网下载:» RFC Editor

本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页,本文下面所说的“页数”是指在pdf阅读器中显示的页数: 

二、MPEG Access Units

根据《RFC 3640》第5页,为了传输压缩后的音视频数据,MPEG定义了Access Units(访问单元)。MPEG Access Units(简称AU)是计时信息的最小数据实体。就音频而言,一个AU可代表一个音频帧,就视频而言,一个AU可代表一幅图像。根据定义,MPEG Access Units是八位对齐的。例如,如果音频帧不是八进制对齐的,则必须在帧末插入多达 7个零的填充位,以实现MPEG-4规范要求的八进制对齐的AU。
MPEG-4解码器必须能够解码使用了这种填充的AU。与MPEG-4规范一致,《RFC 3640》要求每个 MPEG-4第2部分视频的AU包括图像的所有编码数据、编码图像数据之前的任何视频流标题以及其后的任何视频流填充,直至但不包括表示新视频流或下一个AU开始的开始码:

三、有效载荷格式的全局结构

根据《RFC 3640》第9页,RTP Header之后的RTP payload包含三个八位对齐的数据部分,其中前两个(AU Header Section和Auxiliary Section)可能为空,如下图所示。

第一部分是AU (Access Unit) Header Section,包含一个或多个AU-header;但是,每个AU-header可以是空的,在这种情况下,整个AU Header Section都是空的。

第二部分是Auxiliary Section(辅助部分),包含辅助数据;该部分也可以配置为空。

第三部分是Access Unit Data Section,包含一个Access Unit的单个片段或一个或多个完整的Access Unit。Access Unit Data Section不得为空:

四、AU Header Section

根据《RFC 3640》第11页,出现时,AU Header Section由AU-headers-length字段和若干AU-header组成,如下图所示。

AU-header使用MIME格式参数配置,可以为空。如果AU-header配置为空,则AU-headers-length字段不应存在,因此AU Header Section为空。如果AU-header未配置为空,则AU报头长度(AU-headers-length)是占两个字节的字段,用于指定紧随其后的AU-header(不包括填充位)的长度(以比特为单位)。

每个AU-header都与同一RTP数据包中Access Unit Data Section所含的single Access Unit (fragment)相关联。在AU-header中,AU-header按照 Access Unit Data Section中包含Access Unit的顺序逐位连接。因此,第n个AU-header指的是第n个 AU(片段)。如果连接的 AU-header占用的八进制数不是整数,则必须在末尾插入最多7个零填充位,以实现 AU Header部分的八进制对齐:

五、AU-header

根据《RFC 3640》第12页,每个AU-header可包含下图所示的字段。除CTS-flag、DTS-flag和RAP-flag字段外,其他字段的比特长度由MIME格式参数定义。如果MIME格式参数的默认值为零,则不存在相关字段。对于存在且表示参数值的字段,必须选择足够大的比特数,以正确编码会话期间该参数的最大值。

如果存在,这些字段必须按照下图所示的顺序出现。在一般情况下,由于CTS-delta和DTS-delta 字段的是否存在分别由CTS-flag和DTS-flag的值指示,因此接收方只能通过解析AU-header来发现 AU-header的大小。

如果被使用,AU-header中的AU-Index字段只出现在AU Header Section中的第一个AU-header中;在任何其他 AU-header中,则使用AU-Index-delta字段:

其中:

AU-size: 该字段表示同一RTP数据包中Access Unit Data Section中相关Access Unit的大小(以八位字节为单位)。当 AU-size与 AU fragment(AU片段)相关联时,AU-size表示整个AU的大小,而不是片段的大小。在这种情况下,片段的大小可以通过AU data section的大小得知。可以利用这一点来确定数据包包含的是整个AU还是片段,这在丢失携带AU最后一个片段的数据包后特别有用:

AU-Index:该字段表示相关Access Unit(片段)的序列号。对于每个(按解码顺序)连续的AU 或AU片段,序列号都递增1。AU-Index字段出现在AU Header Section的第一个AU-header中,但不得出现在该Section的任何后续(非第一个)AU-header中。要对任何此类非第一个 AU-header中的序列号进行编码,应使用AU-Index-delta字段:

AU-Index-delta:该字段是一个无符号整数,用于指定相关AU的序列号与前一个接入单元序列号的差值。因此,对于第n个(n>1)AU,序列号的计算公式为:

AU-Index(n) = AU-Index(n-1) + AU-Index-delta(n) + 1

如果AU-Index字段出现在AU Header Section的第一个AU-header中,则AU-Index-delta字段必须出现在任何后续(非第一个)AU-header中。当AU-Index-delta的编码值为0时,表示Access Units在解码顺序上是连续的。如果 AU-Index-delta 值大于0,则表示应用了交错:

CTS-flag:该字段表示是否存在CTS-delta字段。值为1表示存在该字段,值为0表示不存在。如果 CTS-delta字段的信号长度大于零,则每个AU-header中必须有CTS-flag字段。在这种情况下,CTS-flag字段在第一个AU-header中的值必须为0,在所有非第一个AU-header中的值可以为1。对于Access Unit的任何非第一片段,CTS-flag字段应为0:

CTS-delta:该字段将CTS的值指定为该RTP数据包RTP header中时间戳的2的补码偏移(delta),从而对CTS进行编码。CTS必须使用与RTP header中时间戳相同的时钟速率:

DTS-flag:表示是否存在DTS-delta字段。值为1表示存在DTS-delta,值为0表示不存在。如果 DTS-delta字段的长度信号大于零,则 DTS-flag字段必须出现在每个AU-header中。一个Access Unit的所有片段的 DTS-flag字段必须具有相同的值:

DTS-delta:该字段将DTS的值指定为CTS的2的补码偏移(delta)。DTS必须使用与RTP header中时间戳相同的时钟速率。对于Access Unit的所有片段,DTS-delta字段必须具有相同的值:

RAP-flag:该字段设置为1时,表示相关的Access Unit为数据流内容提供了一个随机访问点。如果访问单元是分片的,则RAP flag(如果存在)必须为AU的每个非第一分片设置 0:

Stream-state:指定MPEG-4系统流的AU的流状态;每个状态由一个模数计数器的值标识。在 《ISO/IEC 14496-1》中,MPEG-4系统流使用AU_SequenceNumber来表示流状态。当流状态改变时,流状态的值必须递增 1。
 注意:不同流的流状态之间不需要任何关系:

六、The Auxiliary Section

根据《RFC 3640》第14页,Auxiliary Section(辅助部分)由auxiliary-data-size字段和auxiliary-data(辅助数据)字段组成。接收者可以(但不要求)解析auxiliary-data字段;为便于接收者跳过auxiliary-data字段,auxiliary-data-size字段表示auxiliary-data的长度(以比特为单位)。如果 “auxiliary-data-size ”和 “auxiliary-data”字段的连接占用的八进制数不是整数,则必须在auxiliary data后插入最多 7个零填充位,以实现八进制对齐,见下图:

auxiliary-data-size字段的位数可以通过MIME格式参数配置。默认长度为0表示整个Auxiliary Section(辅助段)都不存在。
auxiliary-data-size字段指定紧随其后的auxiliary-data字段的长度,以位(bit)为单位;auxiliary-data(辅助数据)字段包含的数据格式不是《RFC 3640》规范定义的。

七、Access Unit Data Section

根据《RFC 3640》第15页,Access Unit Data Section(访问单元数据节)包含完整的Access Unit(访问单元)的整数或一个AU的单个片段。Access Unit Data Section绝不是空的。如果存在多个Access Unit的数据,则将AU连接成一个连续的八位字节字符串。参见下图。Access Unit Data Section内的AU必须按解码顺序排列,但在交错的情况下不一定是连续的。

应该调整Access Unit的大小和数量,使生成的RTP包不大于途径的MTU。为了处理较大的数据包,这种有效负载格式依赖于较低的分片层,这可能会导致性能降低:

当携带多个Access Unit时,每个AU的大小必须提供给接收器。如果AU的大小是可变的,那么每个AU的大小必须在相应AU-header的AU-size字段中显示。但是,如果流的AU大小是恒定的,则不应该使用该机制;相反,固定大小应该通过MIME格式参数“constantSize”来表示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30723.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统控制台-健康守护我们的系统

引言基本准备体验功能健康守护系统诊断 收获提升结语 引言 阿里云操作系统控制平台作为新一代云端服务器中枢平台,通过创新交互模式重构主机管理体验。操作系统控制台提供了一系列管理功能,包括运维监控、智能助手、扩展插件管理以及订阅服务等。用户可以…

ASP.NET Core 6 MVC 文件上传

概述 应用程序中的文件上传是一项功能,用户可以使用该功能将用户本地系统或网络上的文件上传到 Web 应用程序。Web 应用程序将处理该文件,然后根据需要对文件进行一些验证,最后根据要求将该文件存储在系统中配置的用于保存文件的存储中&#…

JVM之Arthas的dashboard命令以及CPU飙高场景

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明,官网之前的文档准备废除了,基于xsml的开发将退出历史舞台,three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言:STM32G431RBT6实现嵌入式组第七届题目解析源码&…

Java之IO流

什么是IO流 存储和读取数据的解决方案 I:input:输入 O:output:输出 流:像水流一样传输数据 IO流的作用 用于读取数据(本地文件,网络) IO流的分类 流的方向: 输入流&#xff…

Python入门———条件、循环

目录 语句 顺序语句 条件语句 缩进和代码块 判断年份是否是闰年 空语句 pass 循环 while 循环 求5的阶乘: 求1!2!3!4!5! for循环 打印1-10 打印2,4,6,8&#x…

JWT的学习

1、HTTP无状态及解决方案 HTTP一种是无状态的协议,每次请求都是一次独立的请求,一次交互之后就是陌生人。 以CSDN为例,先登录一次,然后浏览器退出,这个时候在进入CSDN,按理说服务器是不知道你已经登陆了&…

【接口负载】✈️整合 Resilience4j 指定接口负载,避免过载

目录 👋前言 🍸一、应用场景 🍻二、 代码实现 🍹三、扩展 🍸四、章末 👋前言 小伙伴们大家好,上次本地实操了下针对百万级数据量如何快速排序、指定条件获取等,文章内容包括&am…

CSS—网格布局Grid

网格布局grid 提供了带有行和列的基于网格的布局系统,无需使用浮动和定位。 当 HTML 元素的 display 属性设置为 grid 或 inline-grid 时,它就会成为网格容器。 更多布局模式可以参考之前的博客: ​​​​​​CSS—flex布局、过渡transit…

表格columns拼接两个后端返回的字段(以umi框架为例)

在用组件对前端项目进行开发时,我们会遇到以下情况:项目原型中有取值范围这个表字段,需要存放最小取值到最大取值。 而后端返回给我们的数据是返回了一个最小值和一个最大值, 在columns中我们需要对这两个字段进行拼接&#xff0…

Git系列之git tag和ReleaseMilestone

以下是关于 Git Tag、Release 和 Milestone 的深度融合内容,并补充了关于 Git Tag 的所有命令、详细解释和指令实例,条理清晰,结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交(commit&#xf…

SQLiteStudio:一款免费跨平台的SQLite管理工具

SQLiteStudio 是一款专门用于管理和操作 SQLite 数据库的免费工具。它提供直观的图形化界面,简化了数据库的创建、编辑、查询和维护,适合数据库开发者和数据分析师使用。 功能特性 SQLiteStudio 提供的主要功能包括: 免费开源,可…

VMware workstation 17安装过程详细指南

VMware 17安装过程详细指南 一、准备工作 在开始安装 VMware 之前,你需要确保你的计算机满足以下条件: 操作系统:VMware Workstation 支持多种 Windows 和 Linux 操作系统。确保你的操作系统版本在 VMware 支持的范围内。 硬件要求&#…

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理

【从零开始学习计算机科学】计算机组成原理(六)异常事件处理 异常事件处理异常处理的数据通路异常事件入口地址 异常事件处理 异常和中断事件改变处理机正常指令的执行顺序。异常指令执行过程中,由于操作非法和指令非法引起的事件。陷阱指陷…

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下: 前端: HTMLCSS后端:Java AIGCDeepseekIDE工具:IDEA技术栈:Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…

WinUI 3 支持的三种窗口 及 受限的窗口透明

我的目标 希望能够熟悉 WinUI 3 窗口的基本使用方式,了解可能出现的问题 。 WinUI 3 支持三种窗口模式,分别为:常规窗口模式、画中画模式、全屏模式。 窗口模式:常规 即我们最常见的普通窗口。 支持:显示最大化按钮…

《云原生监控体系构建实录:从Prometheus到Grafana的观测革命》

PrometheusGrafana部署配置 Prometheus安装 下载Prometheus服务端 Download | PrometheusAn open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.https://prometheus.io/…

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1

目的,判断是否主键重复,不重复则登录新数据,重复则不登录。 定义类型: DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下: 模拟数据库的登录过程。假设…

MySql的in和join对比谁更高效

公司有个SQl根据时间判断是否变化进而更新到主表通知下游服务告知变化 首先看下优化前和优化后的sql: 优化前:执行很慢 UPDATE vrs_video SET updated_at now() WHEREvrs_video.id IN (SELECT DISTINCTvideo_id FROMvrs_play_source WHEREvrs_play_…