获取AAC音频的ADTS固定头部信息
文章目录
- 前言
- 一、AAC音频中的ADTS
- 二、解析ADTS信息
- 1.标准文档中介绍
- 2.解析
- 3.采样率索引和值
- 4.下载AAC标准文档
前言
调试嵌入式设备中播放aac音频的过程中,了解了aac音频格式,记录在此,防止遗忘。
一、AAC音频中的ADTS
ADTS(Audio Data Transport Stream)是AAC(Advanced Audio Coding)音频编码格式的一种常见的封装格式。它用于将AAC音频数据以分帧的方式进行包装和传输。
ADTS封装格式将AAC音频数据按照一定格式进行组织,包括音频帧头信息和音频数据。每个ADTS帧由7个字节的帧头和音频数据组成。
帧头包含了音频帧的一些重要信息,如采样率、声道数、位率、编码类型等。音频数据是经过AAC压缩的音频信号,包含了实际的音频内容。
ADTS封装格式具有一定的错误容忍性和同步性。即使在传输过程中发生了丢包或错误,接收端仍然可以根据帧头信息正确地解析音频数据。此外,ADTS还可以通过添加同步头信息来实现同步传输,确保音频数据在接收端正确播放。
使用ADTS封装格式的好处是它的普遍性和兼容性。它被广泛支持和应用于各种音频播放器、设备和转码器中,包括流媒体传输、音频文件存储等场景。
需要注意的是,ADTS只是AAC的一种封装格式,而AAC编码格式还可以使用其他封装格式,如ADIF、LOAS等。根据具体的需求和使用环境,可以选择适合的AAC封装格式进行音频存储和传输。 【以上信息来源于ChatGPT】
二、解析ADTS信息
1.标准文档中介绍

ADTS 是一种用于传输 AAC 音频的文件格式,头部包含了一些关键信息。下面是各个字段的意义及其作用:
syncword(12 位):同步字,用于标识 ADTS 头部的开始,固定为 0xFFF。ID(1 位):表示 MPEG 标准的版本,0 表示 MPEG-4,1 表示 MPEG-2。layer(2 位):表示编码层次,一般设置为 0。protection_absent(1 位):表示帧是否包含错误检测字,0 表示包含,1 表示不包含。profile(2 位):表示 AAC 的编码配置文件。sampling_frequency_index(4 位):表示采样频率的索引值。private_bit(1 位):暂时不使用,一般设置为 0。channel_configuration(3 位):表示音频通道的配置。original_copy(1 位):表示原始数据复制标志,0 表示副本,1 表示原始数据。home(1 位):暂时不使用,一般设置为 0。copyright_identification_bit(1 位):版权标志位。copyright_identification_start(1 位):表示此帧是否为版权开始。acc_frame_length(13 位):表示 ADTS 帧的长度,包括头部和音频数据。adts_buffer_fullness(11 位):表示音频缓冲区的填充量。number_of_raw_data_blocks_in_frame(2 位):表示 ADTS 帧中的原始数据块数。
2.解析
typedef struct
{unsigned syncword : 12;unsigned ID : 1;unsigned layer : 2;unsigned protection_absent : 1;unsigned profile : 2;unsigned sampling_frequency_index : 4;unsigned private_bit : 1;unsigned channel_configuration : 3;unsigned original_copy : 1;unsigned home : 1;//variableunsigned copyright_identification_bit : 1;unsigned copyright_identification_start : 1;unsigned acc_frame_length : 13;unsigned adts_buffer_fullness : 11;unsigned number_of_raw_data_blocks_in_frame : 2;
} aac_adts_fixed_header_t;int get_aac_header_from_adts(char *buf, int len, aac_adts_fixed_header_t *header)
{// 使用位操作解析 ADTS 固定头部header->syncword = ((buf[0] & 0x0F) << 8) | buf[1];header->ID = (buf[1] >> 3) & 0x01;header->layer = (buf[1] >> 1) & 0x03;header->protection_absent = buf[1] & 0x01;header->profile = (buf[2] >> 6) & 0x03;header->sampling_frequency_index = (buf[2] >> 2) & 0x0F;header->private_bit = (buf[2] >> 1) & 0x01;header->channel_configuration = ((buf[2] & 0x01) << 2) | (buf[3] >> 6);header->original_copy = (buf[3] >> 5) & 0x01;header->home = (buf[3] >> 4) & 0x01;header->copyright_identification_bit = (buf[3] >> 3) & 0x01;header->copyright_identification_start = (buf[3] >> 2) & 0x01;header->acc_frame_length = ((buf[3] & 0x03) << 11) | (buf[4] << 3) | (buf[5] >> 5);header->adts_buffer_fullness = ((buf[5] & 0x1F) << 6) | (buf[6] >> 2);header->number_of_raw_data_blocks_in_frame = buf[6] & 0x03;return 0;
}
上述代码通过位操作将adts头部信息全部取出来,其实常用的也就采样率和帧长度,因为aac音频是允许可变码率的,所以每一帧都有可能长度不一样。
3.采样率索引和值

解析adts信息里的sampling_frequency_index索引,需要找到对应实际的采样率值,以方便设置给解码器。
4.下载AAC标准文档
AAC标准文档下载链接
相关文章:
获取AAC音频的ADTS固定头部信息
文章目录 前言一、AAC音频中的ADTS二、解析ADTS信息1.标准文档中介绍2.解析3.采样率索引和值4.下载AAC标准文档 前言 调试嵌入式设备中播放aac音频的过程中,了解了aac音频格式,记录在此,防止遗忘。 一、AAC音频中的ADTS ADTS(Audi…...
二分查找--C++实现
1. 简介 满足有序性,每次排除一半的可能性。 2. 实现 2.1 手写 int bin_search(vector<int> &arr,int v) {int hi arr.size() - 1;int lo 0;while ( lo < hi){int mid (lo hi) >> 1;if (arr[mid] < v)lo mid 1;elsehi mid - 1;}re…...
计算机毕设 基于机器学习的文本聚类 - 可用于舆情分析
文章目录 0 简介1 项目介绍1.1 提取文本特征1.2 聚类算法选择 2 代码实现2.1 中文文本预处理2.2 特征提取2.2.1 Tf-idf2.2.2 word2vec 2.3 聚类算法2.3.1 k-means 2.3.2 DBSCAN2.4 实现效果2.4.1 tf-idf k-means聚类结果2.4.2 word2vec k-means 聚类结果 最后 0 简介 今天学…...
uniApp获取当前位置经纬度
以下是使用uni.getLocation获取当前位置的示例代码: 调用uni.getLocation方法获取当前位置信息 uni.getLocation({type: wgs84, // 坐标类型,默认为wgs84,可选的值为gcj02和bd09llsuccess: res > {// 获取成功,经度和纬度在r…...
this.$message提示内容添加换行
0 效果 1 代码 let msgArr [只允许上传doc/docx/xls/xlsx/pdf/png/jpg/bmp/ppt/pptx/rar/zip格式文件,且单个文件大小不能超过20MB,已过滤无效的文件] let msg msgArr.join(<br/>) this.$message({dangerouslyUseHTMLString: true,message: msg,type: warning })...
“三大阶段稳定性测试”筑牢长安链信任基石
前言 随着长安链应用生态的不断丰富、面对的应用场景更加多元,稳定性测试在长安链测试流程中占到越来越重要的位置。本文将介绍长安链稳定性测试的发展历程及如何通过三大阶段稳定性测试应对不断出现的复杂的商业需求,筑牢长安链信任基石。 功能测试和…...
手把手教你如何扩展(破解)mybatisplus的sql生成 | 京东云技术团队
mybatisplus 的常用CRUD方法 众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入、更新、删除、查询等)的定义,能够帮助我们节省很多体力劳动。 他的BaseMapper中定义了这些常用的C…...
Spring Data JPA 项目配置与QueryDSL集成
一、说明 Spring Data JPA通过Spring Initializer创建时勾选相关依赖即可引入,QueryDSL需要单独引入。Spring JPA针对QueryDSL有比较好的兼容性,可以实现优雅的SQL构建。 二、设置JPA默认配置(yaml格式) spring:jpa:hibernate:…...
UE5数字孪生制作-数据篇(二) - 数据处理
1.卫星图与DEM高度图坐标一致处理 https://www.bilibili.com/video/BV1op4y1V71r?p4&vd_source707ec8983cc32e6e065d5496a7f79ee6 坐标系的调整 如何使用临时图层,对其他数据层进行裁切 (1)创建临时图层 (2)在临…...
Java 设计模式——享元模式
目录 1.概述2.结构3.实现3.1.抽象享元3.2.具体享元3.3.享元工厂3.4.测试 4.优缺点5.使用场景6.JDK 源码解析——Integer 类 1.概述 (1)享元模式 (Flyweight Pattern) 是一种结构型设计模式,主要通过共享对象来减少系统中的对象数量ÿ…...
再扩国产化适配版图,长安链新增数据库兼容性认证
基础软件的自主可控影响着国家信息安全与产业技术发展是否受制于人。实现真正长期可持续的技术自主可控,需要再进一步的是让国产化信息系统生态更有”活性“,基础软件之间、基础软件与其他国产上层应用的互相兼容、互相促进,共同繁荣发展&…...
MES系统数据集成系统源码
MES系统数据集成系统源码 1 MES的生产计划管理综述 生产计划的管理在MES系统中是非常重要的。我们知道,一般的情况下,企业的生产计划是由上层管理系统ERP来完成,那么MES中的生产计划和ERP的生产计划的不同点在于: ERP的生产计划…...
关于道一云-七巧使用感悟
低代码,开发快速,缺点组件比较少但能满足大多数场景,如果需要的话得自己造,官方的技术群里面普遍问题响应就很快,技术文档这个会抽风,有些代码就改个筛选条件本地死活运行不了,去官网那里问他们…...
去中心化数据云项目Oort主网即将上线
备受期待的去中心化数据云项目Oort,今日已通过官方X账号官宣,将于纽约时间11月27日正式上线主网Olympus Protocol。届时,用户也能够通过Oort的Ale Wallet钱包和开发者API使用主网,并可通过OORT浏览器查询交易和合约,开…...
CSS知识点梳理(一)
CSS 是层叠样式表(Cascading Style Sheets)的缩写,它是一种用于描述 HTML 或 XML(包括如 SVG、MathML 等派生语言)文档呈现的语言。CSS 可以用来控制文档的布局、颜色、字体等外观属性。 CSS 的主要特点包括ÿ…...
网络安全深入学习第八课——反向代理(工具:frp)
文章目录 一、实验环境二、实验要求三、开始模拟1、攻击机配置frp文件2、攻击拿下跳板机,并且上传frpc.ini、frpc.exe、frpc_full.ini文件3、把frps.ini、、frps.exe、frps_full.ini文件放到VPS主机上4、VPS机开启frp5、跳板机开启frp6、验证 一、实验环境 攻击机&…...
浅谈前端自定义VectorGrid矢量瓦片样式
目录 前言 一、VectorGrid相关API介绍 1、VectorGrid 2、 LayerStyles样式详解 二、样式自动配置 1、页面定义 2、地图及PBF瓦片引入 3、矢量瓦片样式定义 4、鼠标事件交互 三、最终效果 1、自定义样式展示 2、鼠标交互 总结 前言 在上一篇博客中,详细讲…...
Qt5多线程<12>
1.多线程的简单实现 <1> 在头文件threaddlg.h声明用于界面显示所需的控件,其代码如下: #ifndef THREADDLG_H #define THREADDLG_H#include <QDialog> #include <QPushButton> #include "workthread.h" #define MAXSIZE 5class ThreadDlg : publ…...
Linux学习笔记之五(父子进程、孤儿进程、僵尸进程、守护进程)
Linux 1、进程1.1、进程的六种状态1.2、创建子进程1.3、添加子进程任务1.4、孤儿进程、僵尸进程、守护进程1.4.1、避免僵尸进程1.4.2、创建守护进程1.4.3、杀死守护进程 1.5、综合练习 1、进程 进程可以简单的理解为一个正在执行的程序,它是计算机系统中拥有资源和…...
[题] 不容易系列之(3)―― LELE的RPG难题 #DP
题目 不容易系列之(3)―― LELE的RPG难题 思路 简单的DP题。 代码 #include<bits/stdc.h> using namespace std; //默认以0开头,以1和2结尾。f[i][1]表示长度为i的以1结尾的涂抹方案 //状态转移方程:若以1结尾,则前面一个格子只能是…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
