音视频入门基础:RTP专题(17)——音频的SDP媒体描述

一、引言

在《音视频入门基础:RTP专题(3)——SDP简介》中对SDP协议进行了简介,以H.264为例介绍了视频的SDP的媒体描述。本文对该文章进行补充,以AAC为例,讲述音频的SDP媒体描述。

二、文档下载

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

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

三、rtpmap

由 《音视频入门基础:RTP专题(3)——SDP简介》可以知道,SDP协议中,

a=rtpmap属性将 RTP有效载荷类型编号(如 “m=”行中使用的)映射到表示有效载荷格式的编码名称。它还提供有关时钟速率和编码参数的信息。格式为:

a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]

encoding name参数跟音视频压缩编码格式相关联。根据《RFC 4566》第26页,对于音频,clock rate参数指定音频采样频率,encoding parameters参数指定音频声道数:

示例:

a=rtpmap:97 MPEG4-GENERIC/48000/2

上述例子表示映射PT值(有效载荷类型)为97的负载类型到AAC编码。音频的采样频率为48000Hz,音频声道数为2。

关于“MPEG4-GENERIC”有两种说法,第一种说法是:它可以用来描述MPEG-4标准中的多种不同类型的媒体编码,但它本身并不特指AAC。具体可以参考:《MPEG-4 Generic》。

第二种说法是:SDP协议中出现“MPEG4-GENERIC”就是指AAC。因为在FFmpeg源码(FFmpeg7.0.1的libavformat/rtpdec_mpeg4.c)中,“MPEG4-GENERIC”对应的就是AAC:

const RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler = {.enc_name           = "mpeg4-generic",.codec_type         = AVMEDIA_TYPE_AUDIO,.codec_id           = AV_CODEC_ID_AAC,.priv_data_size     = sizeof(PayloadContext),.parse_sdp_a_line   = parse_sdp_line,.close              = close_context,.parse_packet       = aac_parse_packet,
};

关于上面哪种说法正确,我查阅了SDP的官方文档,但没发现对应说明。所以就目前而已,我更倾向于第二种说法正确,因为在FFmpeg源码中,“MPEG4-GENERIC”对应的就是AAC。

同理,通过阅读FFmpeg源码,可以发现"opus"对应的是Opus:

static const RTPDynamicProtocolHandler opus_dynamic_handler = {.enc_name   = "opus",.codec_type = AVMEDIA_TYPE_AUDIO,.codec_id   = AV_CODEC_ID_OPUS,
};

"X-MP3-draft-00"对应MP3ADU:

static const RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler = {.enc_name   = "X-MP3-draft-00",.codec_type = AVMEDIA_TYPE_AUDIO,.codec_id   = AV_CODEC_ID_MP3ADU,
};

四、fmtp

由 《音视频入门基础:RTP专题(3)——SDP简介》可以知道:SDP协议中,a=fmtp属性允许以SDP所不具备的方式传递特定格式的参数。格式为:

a=fmtp:<format> <format specific parameters>

对于音频,格式一般为:a=fmtp:XX profile-level-id=X;mode=XXX;sizelength=XX;indexlength=X;indexdeltalength=X; config=XX

其中:

(一)profile-level-id

根据《RFC 3640》第28页,profile-level-id参数为MPEG-4配置文件级别指示的十进制表示。该参数必须在能力交换或会话设置程序中使用,以指示相关MPEG-4媒体编解码器能够处理的MPEG-4配置文件和级别组合。对于MPEG-4音频流,该参数是《ISO/IEC 14496-1》 Table 5(audioProfileLevelIndication Values)中的十进制值,表示解码音频流需要哪些MPEG-4音频工具子集:

《ISO/IEC 14496-1》文档的免费版可以在 http://netmedia.zju.edu.cn/multimedia2013/mpeg-4/ISO%20IEC%2014496-1%20MPEG-4%20System%20Standard.pdf 下载。

根据《ISO/IEC 14496-1》第38页,audioProfileLevelIndication(音频配置文件级别指示)为Table 5中定义的指示,表示处理与此InitialObjectDescriptor(初始对象描述符)相关的内容所需的音频配置文件和级别:

《ISO/IEC 14496-1》中的Table 5(audioProfileLevelIndication Values)内容如下:

比如,如果SDP协议中,音频媒体描述的profile-level-id的值为1,则根据上表(Table 5),表示其Profile为:Level为L1的Main Profile。

(二)mode

根据《RFC 3640》第30页,mode参数为《RFC 3640》规范使用的模式。可使用以下模式:
mode=generic
mode=CELP-cbr
mode=CELP-vbr
mode=AAC-lbr
mode=AAC-hbr。
其他mode预计将在未来的RFC文档中定义。

比如:

1.generic

根据《RFC 3640》第22页,generic mode可用于任何MPEG-4数据流。在这种模式下,不会应用特定模式的限制;因此,在generic mode下,可以充分发挥《RFC 3640》规范的灵活性。generic mode的标志是:mode=generic:

下面给出一个传输BIFS-Anim流的示例。在此示例中,一个 RTP 数据包中允许传输多个BIFS-Anim的Access Unit(关于Access Unit的概念可以参考:《音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构》)。AU-header包含AU-size字段、CTS-flag 和(如果CTS标志设置为 1)CTS-delta 字段。AU-size和CTS-delta字段的位数分别为10和16。AU-header还包含RAP标志和4位的Stream-state。因此,每个BIFS-Anim AU的AU-header总大小为2 或4个八进制字节。RTP时间戳使用1 kHz时钟。请注意,媒体类型名称是视频,因为BIFS-Anim 流是音视频演示的一部分:

2.AAC-lbr

根据《RFC 3640》第24页,该模式由mode=AAC-lbr标志。该模式支持传输一个或多个大小可变的完整AAC帧。在这种模式下,AAC帧允许交错,因此接收器必须支持去交错。在此模式下,AAC帧的最大大小为63个八位字节。使用该模式时,AAC帧不得分片。因此,使用该模式时,编码器必须确保每个AAC帧的大小最多为63个八进制字节。
该模式的有效载荷配置与《RFC 3640》中定义的可变比特率CELP模式相同。RTP有效载荷由AU Header Section和连接的AAC帧组成。Auxiliary Section必须为空。对于有效载荷中包含的每个AAC帧,一个八位字节的AU-header必须提供以下信息:

a) 有效载荷中每个AAC帧的大小,以及

b) 用于计算每个AAC帧的序列(进而计时)的索引信息。

在AU-header Section,连接的AU-header前面必须有16 位AU-headers-length字段。

除了所需的MIME格式参数外,还必须包含以下参数:sizeLength、indexLength和indexDeltaLength。AAC帧的每个Access Unit总是有固定的持续时间;在此模式下进行交错时,必须用MIME格式参数constantDuration来表示特定的持续时间。此外,交错时必须有maxDisplacement(最大位移)参数。

例子:

注:上述例子中,a=fmtp这一行已被包装,以适应页面大小;它在SDP文件中只占一行。config 参数的十六进制值是《ISO/IEC 14496-3》中定义的AudioSpecificConfig。AudioSpecificConfig指定了采样率为22.05kHz的单声道AAC流。

3.AAC-hbr

根据《RFC 3640》第25页,该模式由mode=AAC-hbr标志发出。该模式支持传输大小可变的AAC 帧。在一个RTP数据包中,既可以传输一个或多个完整的AAC帧,也可以传输AAC帧的单个片段。在这种模式下,AAC帧允许交错,因此接收器必须支持去交错。在此模式下,AAC帧的最大大小为 8191个八进制字节。
在这种模式下,RTP有效载荷由AU Header Section组成,其后是一个AAC帧、几个连接的AAC帧或一个fragmented(片段)AAC帧。 Auxiliary Section(辅助部分)必须为空。对于有效载荷中包含的每个AAC 帧,AU Header Section必须有一个 AU-header,以提供以下信息:
 a) 有效载荷中每个 AAC 帧的大小和
 b) 用于计算每个 AAC 帧的序列(以及时序)的索引信息。

对AAC帧的最大尺寸进行编码需要13位。因此,在此配置中,13比特分配给AU-size字段,3比特分配给AU-Index(-delta) 字段。因此,每 AU Header的大小为2个八位字节。每个AU-Index字段的编码值必须为0。在AU Header Section,按照《RFC 3640》第3.2.1节的规定,连接的AU-headers前面必须有一个 16 位的 AU-headers-length字段。

除了所需的MIME 格式参数外,还必须包含以下参数:sizeLength、indexLengthh和indexDeltaLength。每个接入单元的AAC帧总是有固定的持续时间;在此模式下进行交错时,必须用MIME格式参数constantDuration来表示这一特定持续时间。此外,交错时必须有maxDisplacement(最大位移)参数。

例子:

注意:a=fmtp这一行已被包起来以适应页面大小;它在 SDP 文件中只占一行。config 参数的十六进制值是《ISO/IEC 14496-3》中定义的AudioSpecificConfig。AudioSpecificConfig指定了采样率为48kHz的5.1 声道AAC流。

(三)sizelength

根据《RFC 3640》第31页,sizelength参数为AU-header中对AU-size字段进行编码的比特数。sizeLength和constantSize参数不得同时存在:

(四)indexlength

根据《RFC 3640》第31页,indexlength参数为在第一个 AU-header中对AU-Index进行编码的位数。默认值为0,表示每个第一AU-header信息中没有AU-Index字段:

(五)indexdeltalength

根据《RFC 3640》第31页,indexdeltalength参数为在任何非第一AU-header中对AU-Index-delta 字段进行编码的比特数。默认值为0,表示每个非第一AU-header信息中没有 AU-Index-delta字段:

(六)config

根据《RFC 3640》第29页,config参数为媒体有效载荷配置的八进制字符串的十六进制表示。配置数据以MSB优先的方式映射到十六进制八进制串上。配置数据的第一位应位于第一个八位位组的MSB。在最后一个八位位组中,如果需要实现八位位组对齐,配置数据后面应最多有7个零值填充位。

对于MPEG-4音频流,config是《ISO/IEC 14496-3》中定义的音频对象类型特定解码器配置数据 AudioSpecificConfig(关于AudioSpecificConfig可以参考《音视频入门基础:AAC专题(11)——AudioSpecificConfig简介》)。对于结构化音频,AudioSpecificConfig() 可通过本规范未定义的其他方式传递。如果结构化音频的 AudioSpecificConfig() 是通过其他方式传送的,那么配置必须是一个带引号的空十六进制八位字符串,如下所示:config=“”。请注意,未来使用结构化音频 RTP 有效负载格式的模式可能会定义这种其他方式:

例子:

a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=1190

上述例子中:config=1190

0x1190就是二进制的0b0001000110010000。

使用《音视频入门基础:AAC专题(11)——AudioSpecificConfig简介》中的方法进行解析,0b0001000110010000的前5位为:0b00010,也就是十进制的2,所以音频压缩编码格式为:AAC LC (Low Complexity)。

0b0001000110010000中间的4位为:0b0011,也就是十进制的3,所以音频采样频率为48000Hz。

之后的4位为:0010,也就是十进制的2,所以是双声道(立体声)。

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

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

相关文章

MyBatis-Plus防全表更新与删除插件BlockAttackInnerInterceptor

防全表更新与删除插件 BlockAttackInnerInterceptor 是 MyBatis-Plus 框架提供的一个安全插件&#xff0c;专门用于防止恶意的全表更新和删除操作。该插件通过拦截 update 和 delete 语句&#xff0c;确保这些操作不会无意中影响到整个数据表&#xff0c;从而保护数据的完整性…

嵌入式开发之STM32学习笔记day06

基于STM32F103C8T6的开发实践——从入门到精通01 1. 引言 STM32系列微控制器是STMicroelectronics推出的一款高性能、低功耗的32位微控制器&#xff0c;广泛应用于嵌入式系统中。STM32F103C8T6是其中非常受欢迎的一款&#xff0c;凭借其强大的性能、丰富的外设接口和低廉的价格…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

Ubuntu22.04虚拟机里安装Yolov8流程

1. 安装pytorch sudo apt install nvidia-cuda-toolkit nvcc --version # 官方适配地址&#xff1a;https://download.pytorch.org/whl/torch/import torch print(torch.__version__) print(torch.cuda.is_available())2. 安装环境 # cuDNN 安装&#xff1a;https://develop…

stm32第五天按键的基础知识

一&#xff1a;按键连接示意图 按键控制LED灯 软件设计流程 初始化系统 o 初始化GPIO外设时钟 o 初始化按键和LED的引脚 • 检测按键输入电平来控制LED灯 o SW2控制灯开 。 SW3控制灯关 1&#xff1a;key.c工程 #include"key.h" #include"stm32f10x.h"v…

Xposed模块开发:运行时修改技术

1. Xposed框架核心原理 1.1 运行时架构解析 Android ART Hook机制&#xff1a; graph TD A[目标APP进程] --> B{系统Zygote} B -->|加载Xposed| C[XposedBridge] C --> D[模块1] C --> E[模块2] D --> F[Hook目标方法] E --> F 1.1.1 核心组件交…

【Python学习笔记】一些关于多线程,xls文件读取,PyQt5,PyInstaller打包等问题的解决方案记录

背景&#xff1a; 最近利用休息时间写了个小型exe程序&#xff0c;主要涉及的技术点有&#xff1a;多线程&#xff0c;读取xls文件&#xff0c;基于PyQt5的简单GUI页面&#xff0c;利用PyInstaller打包成exe。虽然有ChatGPT等协助&#xff0c;但难免还是在开发过程中遇到了一些…

基于javaweb的SpringBoot智能相册管理系统图片相册系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

【AI知识管理系统】(一)AI知识库工具测评

嘿,朋友们!🧐你们有没有想过,咱们平日里那些一闪而过的知识笔记、各种碎片化的idea,记录下来之后都是怎么管理的呀? 还有啊,咱们读过的那些书,大家会不会随手写点东西记录一下呢?📝要知道,如果不写的话,很可能过不了多久就全忘得一干二净啦。 😭那多年前记下的…

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…

C++从入门到入土(八)——多态的原理

目录 前言 多态的原理 动态绑定与静态绑定 虚函数表 小结 前言 在前面的文章中&#xff0c;我们介绍了C三大特性之一的多态&#xff0c;我们主要介绍了多态的构成条件&#xff0c;但是对于多态的原理我们探讨的是不够深入的&#xff0c;下面这这一篇文章&#xff0c;我们将…

自带多个接口,完全免费使用!

做自媒体的小伙伴们&#xff0c;是不是经常为语音转文字的事儿头疼&#xff1f; 今天给大家推荐一款超实用的语音转文字软件——AsrTools&#xff0c;它绝对是你的得力助手&#xff01; AsrTools 免费的语音转文字软件 这款软件特别贴心&#xff0c;完全免费&#xff0c;而且操…

国内首款载重1吨级无人运输机TP1000首飞成功 2026年投入应急救援

大湾区经济网珠海快讯&#xff0c;据央视新闻报道&#xff0c;3月15日上午&#xff0c;国内首款载重1吨级大型无人运输机TP1000在山东成功首飞。该机由中国民航适航标准完全自主研发&#xff0c;起飞重量3.3吨&#xff0c;满载航程达1000公里&#xff0c;具备智能空投功能&…

设计模式Python版 访问者模式

文章目录 前言一、访问者模式二、访问者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…

(性能测试)性能测试工具 2.jmeter的环境搭建 3jmeter元件和4使用实例 5jmeter元件和参数化

目录 性能测试工具 性能测试工具 jemeter环境搭建 jmeter的常用目录介绍 jmeter修改语言和主题--jmeter界面的汉化 jmeter元件 jmeter元件和组件的介绍 jmeter的作用域原则 jmeter的执行顺序 案例&#xff1a;执行顺序 jmeter使用案例 jmeter线程组的介绍 jmeter…

书摘 ASP.NET Core技术内幕与项目实战:基于DDD与前后端分离

IT行业的发展瞬息万变,新技术层出不穷,很多技术人员出于个人兴趣、个人职业发展等考虑而选择一些流行的新技术,他们会把各种复杂的架构模式、高精尖的技术都加入架构中,这增加了项目的复杂度、延长了交付周期、增加了项目的研发成本。有些技术并不符合公司的情况,最后项目…

Spring Cloud 负载均衡(Ribbon)- 流量管理与服务调用优化

一、Spring Cloud Ribbon 概述 1、什么是 Spring Cloud Ribbon&#xff1f; Spring Cloud Ribbon 是一个基于客户端的负载均衡器&#xff0c;其核心目标是为微服务架构中的服务调用提供智能流量分发能力。与传统的服务端负载均衡&#xff08;如 Nginx&#xff09;不同&#x…

内网环境安装dlv,本地远程调试go

背景&#xff1a;内网环境(服务器)下安装dlv,本地通过dlv调试编译后的go代码。 可以配合观看: 【dlv远程调试-哔哩哔哩】 https://b23.tv/NqPZ5q9 内网安装dlv步骤 1、dlv安装: &#xff08;我额服务器和内网的go都是1.21以上&#xff09; # 先在有网络的环境下&#xff08…

C# MVC项目部署II后错误,403禁止访问:访问被拒绝问题处理

C# MVC项目部署II后错误&#xff0c;403禁止访问&#xff1a;访问被拒绝问题处理 问题如下&#xff1a; 解决办法&#xff1a; 1. 应用程序池要选v4.xx&#xff0c;托管模式选“集成” 2. 把asp.net 4.xx安装在iis上&#xff0c;方法&#xff1a; cd \Windows\Microsoft .NE…

基于Flask的东方财富网股票数据可视化分析系统

【大数据】基于Flask的东方财富网股票数据可视化分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统能够高效地从东方财富网抓取股票数据&#xff0c;并通过Python的强大数据处理能…