音视频入门基础: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”来表示。
相关文章:
音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构
一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式,这两个文档都可以从RFC官网下载: RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页,本文下面所说的“页数”是指在pdf阅读…...
通领科技冲刺北交所
高质量增长奔赴产业新征程 日前,通领科技已正式启动在北交所的 IPO 进程,期望借助资本市场的力量,加速技术升级,推动全球化战略布局。这一举措不仅展现了中国汽车零部件企业的强大实力,也预示着行业转型升级的新突破。…...
超分之DeSRA
Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA:检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景: GAN-SR模型虽然…...
Ubuntu用户安装cpolar内网穿透
前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件,不仅能够在多种环境和应用场景中发挥巨大作用,还能适应多种操作系统,应用最为广泛的Windows、Mac OS系统自不必多说,稍显小众的Linux、树莓派、群辉等也在起支持之列&#…...
小程序事件系统 —— 33 事件传参 - data-*自定义数据
事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参; 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成…...
【Java学习】包装类
面向对象系列九 包装类变量 一、装箱 1.实例化包装对象 2.静态缓存池 3.写法 二、拆箱 包装类变量 每个基本数据类型都有对应的基本类型的包装类变量,将基本数据类型通过对应的包装类对象载入着进入到类与对象面向对象体系 一、装箱 Integer.valueOf(int) —…...
中国自动化领域零部件研究报告
一、引言 1.1 研究背景与目的 随着科技的飞速发展,自动化技术已成为推动各行业转型升级的关键力量。中国自动化领域零部件行业在近年来取得了显著进展,市场规模持续扩大,技术水平不断提升。在政策支持与市场需求的双重驱动下,中…...
Neo4j 数据库备份
将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时,能够迅速恢复数据库到最近的状态,减少可能的业务影响。对于不同的数据库环境(开发、测试或生产),根据…...
【每日学点HarmonyOS Next知识】span问题、组件标识属性、属性动画回调、图文混排、相对布局问题
1、HarmonyOS 如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常? 如果有两个span 第一个span放的是中文 第二个span超长 这时候 Ellipsis会展示异常 设置断行规则.wordBreak(WordBreak.BREAK_ALL)即可。 参考连接:http…...
MySQL数据集成:高效数据同步与监控
MySQL数据集成案例分享:user-钉钉部门树-名称刷新 在企业信息系统中,数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到另一个MySQL数据库中,方案名称为“u…...
时序数据库TimescaleDB基本操作示例
好的!以下是使用 TimescaleDB 的 Java 示例(基于 JDBC,因为 TimescaleDB 是 PostgreSQL 的扩展,官方未提供独立的 Java SDK): 1. 添加依赖(Maven) <dependency><groupId&g…...
【VBA】WPS/PPT设置标题字体
通过VBA,配合左上角的快速访问工具栏,实现自动化调整 选中文本框的 字体位置、大小、颜色。 配合quicker更加便捷 Sub DisableAutoWrapAndFormat()Dim shp As Shape 检查是否选中了一个形状(文本框)If ActiveWindow.Selection.Typ…...
Python Flask 和数据库系统交互
Python Flask 和数据库系统交互 Python Flask 和数据库系统交互 Python Flask 和数据库系统交互 全栈网页应用程序需要结构化数据的持久性,因此使用数据库的知识和经验是网页开发的先决条件。Python 和Flask 可以与大多数SQL或无SQL数据库系统集成。Python本身附带…...
Qt:事件
目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架,Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽: 用户进行的各种操作,就可能会产生出信号,可以…...
3个 Vue Scoped 的核心原理
大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员👨🏻💻,关注我,科技未来或许我能帮到你! 先用一句话概括 Vue Scoped 的核心原理:Vue 的 scoped…...
物联网IoT系列之MQTT协议基础知识
文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么?什么是MQTT?为什么说MQTT是适用于物联网的协议?MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...
工程化与框架系列(26)--前端可视化开发
前端可视化开发 📊 引言 前端可视化是现代Web应用中不可或缺的一部分,它能够以直观的方式展示复杂的数据和信息。本文将深入探讨前端可视化开发的关键技术和最佳实践,包括图表绘制、数据处理、动画效果等方面。 可视化技术概述 前端可视化…...
ubuntu 20.04 C++ 源码编译 cuda版本 opencv4.5.0
前提条件是安装好了cuda和cudnn 点击下载: opencv_contrib4.5.0 opencv 4.5.0 解压重命名后 进入opencv目录,创建build目录 “CUDA_ARCH_BIN ?” 这里要根据显卡查询一下,我的cuda是11,显卡1650,所以是7.5 查询方法1࿱…...
2025-03-07 学习记录--C/C++-PTA 习题8-5 使用函数实现字符串部分复制
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 二、代码(C语言)⭐️ #include <stdio.h> #define MAXN 20void strmcpy( char…...
【星云 Orbit•STM32F4】13. 探索定时器:基本定时器
【星云 Orbit•STM32F4】13. 探索定时器:基本定时器 七律 定时器 芯片之心精巧藏, 定时精准度量长。 初学莫畏千般难, 动手方知妙用强。 为读者提供完整代码,但不提供代码文件,也别做“三键”工程师。唯有自己动手&…...
江科大51单片机笔记【10】蜂鸣器(上)
一、蜂鸣器 1.原理 蜂鸣器是一种将电信号转换为声音信号的器件,常同来产生设备的按键音、报警音等提示信号蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器(外观基本一样)有源蜂鸣器:内部自带振荡源,将正负极接上直流…...
最新版本WebContext构造函数-避坑
import org.thymeleaf.context.IWebContext; import org.thymeleaf.context.WebContext; 当你想把页面信息全部获取出来存到redis缓存中使用时,SpringWebContext在Spring5中报错 SpringWebContext ctx new SpringWebContext(request, response,request.getServlet…...
Java基础系列:深入解析Object类与面向对象编程核心机制
目录 一、Object类:万物之源的方法解析 1. 核心方法全景图 2. 关键方法深度剖析 2.1 equals与hashCode的契约关系 2.2 clone方法的三重陷阱 2.3 finalize方法的死亡警告 二、面向对象三大支柱解析 1. 封装(Encapsulation)安全防线 2…...
Spring Boot API 项目中 HAProxy 与 Nginx 的选择与实践
在开发 Spring Boot 构建的 RESTful API 项目时,负载均衡和反向代理是提升性能与可用性的关键环节。HAProxy 和 Nginx 作为两种流行的工具,经常被用于流量分发,但它们各有侧重。究竟哪一个更适合你的 Spring Boot API 项目?本文将…...
C++ 数据结构详解及学习规划
C++数据结构详解及学习规划 一、C++常用数据结构详解与示例 以下是C++中核心数据结构的分类及具体实现示例: 1. 线性数据结构 a. 数组(Array) • 定义:存储固定大小、同类型元素的连续内存结构。 • 特点:快速随机访问(O(1)),但插入/删除效率低(O(n))。 • 应用场…...
Spring Boot启动流程及源码实现深度解析
Spring Boot启动流程及源码实现深度解析 一、启动流程概述 Spring Boot的启动流程围绕SpringApplication类展开,核心流程可分为以下几个阶段: 初始化阶段:推断应用类型,加载ApplicationContextInitializer和ApplicationListene…...
2025 开发AI软件的应用场景和优势
在人工智能技术持续突破的今天,AI软件开发已从实验室走向千行百业的核心战场。本文深入剖析医疗影像诊断、智能制造预测性维护、金融风控决策链等六大落地场景,揭示AI如何通过算法重构业务流程——某三甲医院通过病理AI系统将诊断效率提升4倍,…...
忘记dedecms后台超级管理员账号和密码的解决方案
解决方案: 方案一、数据库修改: 1、前提是您能登录到数据库后台,登录MySQL数据库管理工具(如phpMyAdmin) 2、打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a7…...
Kubernetes中的 iptables 规则介绍
#作者:邓伟 文章目录 一、Kubernetes 网络模型概述二、iptables 基础知识三、Kubernetes 中的 iptables 应用四、查看和调试 iptables 规则五、总结 在 Kubernetes 集群中,iptables 是一个核心组件, 用于实现服务发现和网络策略。iptables 通…...
标量、向量、矩阵与张量:从维度理解数据结构的层次
在数学和计算机科学中,维度描述了数据结构的复杂性,而标量、向量、矩阵、张量则是不同维度的数据表示形式。它们的关系可以理解为从简单到复杂的扩展,以下是详细解析: 1. 标量(Scalar):0维数据 定义:单个数值,没有方向,只有大小。 维度:0维(无索引)。 示例: 温度…...
