从零开始精通RTSP之传输AAC音频流

概述

        AAC,英文全称为Advanced Audio Coding,是一种高效的有损音频压缩格式,由MPEG-4标准定义。相比传统的MP3,AAC在相同比特率下能提供更好的音质,尤其在低比特率场景下优势明显。AAC支持多种采样率、声道数和编码工具,比如:LC(Low Complexity)、HE-AAC(High-Efficiency AAC)、HE-AAC v2(增强型高效率AAC)等,可适应不同应用场景的需求。

AAC ADTS

        AAC ADTS是指AAC数据在传输或存储时,采用的封装格式。ADTS为AAC编码的音频数据提供了一个标准化的容器,使得非实时流媒体环境(比如:文件系统、HTTP下载等)也能方便地处理和识别AAC数据。ADTS头部结构详细描述了封装AAC音频数据的ADTS帧的前导部分,它包含了必要的信息以供解码器正确识别、解析和解码AAC音频数据。在实际应用中,ADTS头部通常为7个字节,不包含CRC校验。当需要增加数据完整性检查时,可以选择添加2个字节的CRC校验,此时头部总长度为9个字节。ADTS头部包含以下字段。

        syncword:同步字,固定为0xFFF,占12位,用于识别ADTS帧的起始位置。

        ID:固定为0,占1位,表明是MPEG-4格式的音频数据。

        layer:固定为0,占2位,无特定含义,在MPEG-1/2 Layer III中用于区分层信息,但在AAC中未使用。

        protection absent:占1位,表示是否包含CRC校验。1表示没有CRC校验(通常情况),0表示存在CRC校验。

        profile:占2位,表示AAC编码的Profile,如0表示AAC Main Profile,1表示AAC Low Complexity (LC),2表示AAC Scalable Sample Rate (SSR),3保留。

        sampling freq:占4位,采样率索引,指示音频的采样频率。比如:0表示96 kHz,1表示88.2 kHz,2表示64 kHz,3表示48 kHz,4表示44.1 kHz,5表示32 kHz,6表示24 kHz,7表示22.05 kHz,8表示16 kHz,9表示12 kHz,10表示11.025 kHz,11表示8 kHz,12至15保留。

        private bit:占1位,保留位,通常为0。

        channel config:占3位,表示声道数配置。比如:0表示单声道,1表示立体声,2至7表示多声道模式。

        original/copy:占1位,原版/复制标志,通常为0,表示原版。

        home:占1位,保留位,通常为0。

        emphasis:占2位,强调模式,通常为0,表示无强调。

        frame length:占13位,表示当前ADTS帧的总长度(不包括syncword和CRC,如果有),单位为字节。

        adts buffer fullness:占11位,解码器缓冲区状态信息,用于解码器的缓冲管理。

        number of raw data blocks:占2位,原始数据块数量,通常为00,表示只有一个数据块。

        optional CRC:可选,占16位。如果protection absent字段为0,则ADTS头后会跟随一个16-bit的CRC校验码,用于检测ADTS头的完整性。

封装方法

        RTP封装AAC音频数据时,需要遵循一定的规则和步骤,以确保音频数据能够被正确地传输和解码。与H264、H265的封装方法相比,AAC的封装方法相对比较简单。AAC音频帧一般比较小,只用一个RTP包便可以承载。因此,可以直接将AAC音频数据放入一个RTP包的Payload中。注意:AAC音频数据不包括ADTS头。此时,RTP包的结构如下。

+-----------------------------+
| RTP Header (12 Byte)        |
| AAC Header (4 Byte)         |
| AAC Data ...                |
+-----------------------------+

        可以看到,在12字节的RTP Header后,还有4字节的AAC Header,最后才是AAC音频数据。AAC Header的第一个字节固定为0x00,第二个字节固定为0x10。第三、四个字节保存AAC Data的大小,最多只能保存13位。第三个字节保存数据大小的高8位,第四个字节的高5位保存数据大小的低5位。如果用C/C++实现,可以参考下面的示例代码。

rtpPacket->payload[0] = 0x00;
rtpPacket->payload[1] = 0x10;
// 取aacDataLen的高8位
rtpPacket->payload[2] = (aacDataLen & 0x1FE0) >> 5;
// 取aacDataLen的低5位
rtpPacket->payload[3] = (aacDataLen & 0x1F) << 3;

AAC的SDP

        在使用裸AAC(Raw AAC)格式时,SDP媒体描述应反映这种封装方式,以便接收端能够正确识别、配置解码器并处理音频流。下面,给出了一个针对裸AAC格式的典型SDP媒体描述。

v=0
o=- 1595963774959070000 1 IN IP4 192.0.2.1
s=Example Session
t=0 0
m=audio 49250 RTP/AVP 96
c=IN IP4 192.0.2.1
a=rtpmap:96 MPEG4-GENERIC/44100/2
a=fmtp:96 streamtype=5;profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;
a=ptime:1024
a=maxptime:6144
a=control:trackID=1

        m=行中,audio表明这是一个音频媒体流;49250是传输此音频流所使用的端口号;RTP/AVP表示使用RTP进行传输,且使用AVP作为默认的RTP特性集;96是RTP负载类型,用于标识封装在RTP包内的AAC数据。这个值必须与接收端协商一致,以便接收端能够识别出AAC音频。

        a=rtpmap行定义了负载类型(PT=96)对应的编码格式和参数。MPEG4-GENERIC表示使用MPEG-4 Generic编码格式封装数据,对于裸AAC而言,这是合适的标识符。44100表示采样率为44.1 kHz,2表示双声道(立体声)。

        a=fmtp行提供了负载类型(PT=96)的附加参数。streamtype=5指定为音频流(MPEG-4 Object Type Indication)。profile-level-id=1用于指定AAC编码的Profile和Level,但实际值需参照AAC标准或具体实现。mode=AAC-hbr表示使用AAC High Bit Rate(HBR)模式。sizelength=13;indexlength=3;indexdeltalength=3为AAC音频配置信息的长度,具体值根据实际AAC配置而定。

        a=ptime行表示建议的解码器缓冲区处理的最短有效载荷时间(取样点数或毫秒),在此例中为1024个采样点。对于44.1 kHz采样率,相当于约23.2毫秒。

        a=maxptime行设置了接收端解码器缓冲区应能处理的最大有效载荷时间(取样点数或毫秒),防止过大的包导致缓冲溢出,在此例中为6144个采样点。对于44.1 kHz采样率,约为143毫秒。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AMD优化策略

FPGA&#xff0c;英文全称是 Field Programmable Gate Array&#xff0c;中文意思是现场可编程门阵列。基本架构&#xff1a;可配置逻辑模块&#xff08;CLB&#xff1a; Configurable Logic Block&#xff09;、开关矩阵&#xff08;Switch Matrix&#xff0c;也称为 Switch B…

kraken2 最新版安装,极简模式

kraken2 git clone https://github.com/DerrickWood/kraken2.gitcd kraken2./install_kraken2.sh /opt/krakenvim .bashrc ---------------- # Kraken export PATH"/opt/kraken:$PATH" ----------------source .bashrc Note: 不晓得是不是我设置了清华源&#xff0c…

【Django学习笔记(十)】Django的创建与运行

Django的创建与运行 前言正文1、安装Django2、创建项目2.1 基于终端创建项目2.2 基于Pycharm创建项目2.3 两种方式对比 3、默认项目文件介绍4、APP5、启动运行Django5.1 激活App5.2 编写URL和视图函数对应关系5.3 启动Django项目5.3.1 命令行启动5.3.2 Pycharm启动5.3.3 views.…

Web3智能物联网:科技连接的未来世界

在当今科技飞速发展的时代&#xff0c;Web3智能物联网正逐渐成为人们关注的焦点。随着区块链技术的不断成熟和普及&#xff0c;以及物联网的普及和应用&#xff0c;Web3智能物联网作为二者的结合&#xff0c;将为未来的数字世界带来革命性的变化。本文将深入探讨Web3智能物联网…

【JavaEE 初阶(三)】多线程代码案例

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.单例模式2.1饿汉方式2.2饿汉方式 3.阻塞队列3.1概念3.2实现 4.定时器4.1概念4.…

Linux常用名命令

Linux是一款免费的操作系统&#xff0c;用户可以通过网络或其他途径免费获得&#xff0c;并可以任意修改源代码&#xff0c;这是其他操作系统做不到的&#xff0c;Ubuntu&#xff0c;Centos。 linux中&#xff0c;一切皆文件。 一些重要的目录 / 根目录&#xff0c;所有文件都放…

2024-05-08 精神分析-对损失和挫败的强烈易感性-分析

摘要: 对损失的强烈的易感性&#xff0c;会在遭受损失或者挫败的时候&#xff0c;表现的极其敏感&#xff0c;这个过程主要是在创业的过程中更加强烈的表现并带来巨大的影响。必须要对其进行彻底的分析&#xff0c;并保持对此行为的长期的警惕。 所谓前事不忘后事之师&#x…

JAVA IO/NIO 知识点总结

一、常见 IO 模型简介 1. 阻塞IO模型 最传统的一种IO模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出IO请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线…

WIFI模块UDP电脑端调试

一&#xff0c;两端都是电脑端 1&#xff0c;电脑本机的IP地址 192.168.137.1 2&#xff0c;新建两个不同的连接&#xff0c;注意端口 二&#xff0c;WIFI 模块和电脑端连接 1&#xff0c;设置模块端目标IP和端口&#xff0c;电脑端只接收数据的话&#xff0c;IP、端口可随…

effective python学习笔记_pythonic思维

优缺点 书的好处是很多新特性提高了可读性代码性等各方面性能&#xff0c;缺点是新特性和py老版本不兼容&#xff0c;老版本可能没有这些新特性&#xff0c;如果用了py早期版本&#xff0c;需要考虑替代方案 查py版本 import sys sys.version sys.version_info 遵循PEP8 …

python turtle

名字动画 #SquareSpiral1.py import turtle t turtle.Pen() turtle.bgcolor("black")my_nameturtle.textinput("输入你的姓名","你的名字&#xff1f;") colors["red","yellow","purple","blue"] for…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑热动态的综合能源系统碳排放流建模与分析》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

浅谈智能电气火灾监控系统的设计及应用

摘要&#xff1a;致电气火灾的原因是多方面的&#xff0c;主要成因包括漏电、绝缘层老化、短路、电火花密集、接地发生故障、电气设备自然、接触不良和电流超负荷等。文章分析电气火灾的成因&#xff0c;并探索电气火灾监控系统的设计方案与注意事项。 关键词&#xff1a;电气…

【数据结构】闲谈A股实时交易的数据结构-队列

今天有点忙&#xff0c;特意早起&#xff0c;要不先写点什么。看到个股的红红绿绿&#xff0c; 突然兴起&#xff0c;要不写篇文章分析下A股交易的简易版数据结构。 在A股实时股票交易系统中&#xff0c;按照个人理解&#xff0c;大致会用队列来完成整个交易。队列&#xff08;…

WordPress原创插件:当日24小时发布文章标题变红

WordPress原创插件&#xff1a;当日24小时发布文章标题变红 <?php// 添加自定义样式 function title_red_plugin_styles() {$current_time time();$post_time get_the_time(U);$time_difference $current_time - $post_time;if ($time_difference < 86400) {echo&l…

SSH的魅力:为何它成为远程访问的首选

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、SSH简介 2、SSH的历史与发展 3、SSH的主要用…

每日OJ题_贪心算法三③_力扣45. 跳跃游戏 II(dp解法+贪心解法)

目录 力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 力扣45. 跳跃游戏 II 45. 跳跃游戏 II 难度 中等 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 num…

课程作业管理系统,基于 SpringBoot+Vue+MySQL 开发的前后端分离的课程作业管理系统设计实现

目录 一. 前言 二. 功能模块 2.1. 管理员功能模块 2.2. 教师功能模块 2.3. 学生功能模块 三. 部分代码实现 四. 源码下载 一. 前言 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势…

Java并发编程: Synchronized锁升级

文章目录 一、jdk8 markword实现表二、使用工具来查看锁升级 一、jdk8 markword实现表 new -> 偏向锁 -> 轻量级锁&#xff08;自旋锁、自适应自旋锁&#xff09;-> 重量级锁&#xff1a; 偏向锁和轻量级锁都是用户空间完成的。重量级锁是需要向内核申请的。 synchr…

Jenkins +配置邮件 centos8.5 安装部署 运维系列一

1 jenkins的war包下载地址: Download and deploy 2 xftp 等方式上传到服务器 #安装jdk tar zxvf jdk-11.0.8_linux-x64_bin.tar.gz mv jdk-11.0.8/ /usr/local/jdk vim /etc/profile export JAVA_HOME/usr/local/jdk export PATH$JAVA_HOME/bin:$PATH CLASSPATH.:$JAVA_…
最新文章