获取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标准文档下载链接


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

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

相关文章

深度学习 opencv python 实现中国交通标志识别 计算机竞赛

文章目录 0 前言1 yolov5实现中国交通标志检测2.算法原理2.1 算法简介2.2网络架构2.3 关键代码 3 数据集处理3.1 VOC格式介绍3.2 将中国交通标志检测数据集CCTSDB数据转换成VOC数据格式3.3 手动标注数据集 4 模型训练5 实现效果5.1 视频效果 6 最后 0 前言 &#x1f525; 优质…

思谋科技进博首秀:工业多模态大模型IndustryGPT V1.0正式发布

大模型技术正在引领新一轮工业革命&#xff0c;但将其应用于工业制造&#xff0c;仍面临许多挑战&#xff0c;专业知识的缺乏是关键难点。11月5日&#xff0c;香港中文大学终身教授、思谋科技创始人兼董事长贾佳亚受邀参加第六届中国国际进口博览会暨虹桥国际经济论坛开幕式。虹…

物联网水表电子阀工作原理是怎样的?

随着科技的不断发展&#xff0c;物联网技术逐渐深入到我们的生活之中。作为智能家居的重要组成部分&#xff0c;物联网水表电子阀凭借其智能化、节能环保等优势&#xff0c;受到了越来越多用户的青睐。接下来&#xff0c;合众小编将来为大家介绍下物联网水表电子阀工作原理。 一…

《面纱》细嚼的句子

记住&#xff0c;履行职责并不值得称道 因为那是你应该做的&#xff0c;就像手脏了该洗手一样。唯有一点颇为重要&#xff0c;那就是爱你的职责。当爱和职责合而为一时&#xff0c;上天就会降恩典于你&#xff0c;让你享受到你连想都不敢想的无边的幸福。——《面纱》 所谓“道…

FreeRTOS五种内存管理详解

freeRTOS五种内存管理详解 heap1 源码分析 void * pvPortMalloc( size_t xWantedSize ) {void * pvReturn NULL; // 申请的内存地址static uint8_t * pucAlignedHeap NULL; // 用于指向堆内存的起始地址#if ( portBYTE_ALIGNMENT ! 1 ) // 如果对齐为1则不对齐&#xff0c…

SpringBoot实现mysql与clickhouse多数据源

一、我们来实现一个mysql与clickhouse多数据源配置 二、数据源配置 # 指定服务名称 spring:application:name: demobigdatadatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/db?createDatabaseIfNotExisttrue&useUnicodetrue&…

2023云栖大会,Salesforce终敲开中国CRM市场

2015年被视为中国CRM SaaS元年&#xff0c;众多CRM SaaS创业公司和厂商在Salesforce的榜样作用下涌入了CRM SaaS赛道。在全球市场&#xff0c;Salesforce是CRM SaaS领域的领导厂商&#xff0c;连续多年占据了全球CRM SaaS第一大厂商地位。然而&#xff0c;Salesforce作为业务类…

leetcode刷题日记:100.Same Tree(相同的树)和101.Symmetric Tree(对称二叉树)

100.Same Tree(相同的树) 题目给了我们两棵树要我们判断这两颗树是否相同&#xff0c;我首先想到的就是前序序列与中序序列可以唯一确定一棵树&#xff0c;如果我能分别确定这两棵树的前序序列与中序序列&#xff0c;然后再分别比较它们的前序序列与中序序列就能得到这两棵树是…

WPF中ElementName与RelativeSource绑定的局限性以及对策

完全来源于十月的寒流&#xff0c;感谢大佬讲解 <Window x:Class"Test_01.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schem…

3D可视化字母出现频率_vtkLinearExtrusionFilter

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;统计输入文本中字母出现的频率&#xff0c;不区分大小写&#xff0c;使用3D可是化方式进行显示&…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题&#xff1f; 域名缓存问题 我们知道CND会进行域名解析&#xff0c;但是由于本地会进行缓存对应的域名-ip地址&#xff0c;所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候&#xff0c;需要进行…

【单片机基础小知识-如何通过指针来读写寄存器】

寄存器的本质就是内存&#xff0c;RAM&#xff0c;而指针是可以对内存进行操作的&#xff0c;因此可以通过指针来读写寄存器。 如何读取以下一片地址&#xff1a; 步骤1、首地址 结构体&#xff0c;它所占用的内存空间大小与它内部成员有关。 构造一个28字节的类型 type…

JAVA深化篇_36—— Java网络编程中的常用类

Java网络编程中的常用类 Java为了跨平台&#xff0c;在网络应用通信时是不允许直接调用操作系统接口的&#xff0c;而是由java.net包来提供网络功能。下面我们来介绍几个java.net包中的常用的类。 InetAddress的使用 作用&#xff1a;封装计算机的IP地址和DNS&#xff08;没…

常用设计模式——模板方法模式

什么是模板方法模式 模板方法模式&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 主要解决&#xff1a;一些方法通用&#xff0c;却要在每一个子类都重写这些方法…

数据结构-单链表-力扣题

移除链表元素 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;和前面学的单链表的中间删除数据一样&#xff0c;使要被删除节点的前一个节点指向下要被删除节点的下一个节点&#xff0c;然后把要被删除的节点free掉。 具体实现过程&#xff1a;先…

0成本LLM微调上手项目,⚡️一步一步使用colab训练法律LLM,基于microsoft/phi-1_5,包含lora微调,全参微调

项目地址 &#xff1a;https://github.com/billvsme/train_law_llm ✏️LLM微调上手项目 一步一步使用Colab训练法律LLM&#xff0c;基于microsoft/phi-1_5 。通过本项目你可以0成本手动了解微调LLM。 nameColabDatasets自我认知lora-SFT微调train_self_cognition.ipynbsel…

Spring Boot自动配置原理、实战、手撕自动装配源码

Spring Boot自动配置原理 相比较于传统的 Spring 应用&#xff0c;搭建一个 SpringBoot 应用&#xff0c;我们只需要引入一个注解 SpringBootApplication&#xff0c;就可以成功运行。 前面四个不用说&#xff0c;是定义一个注解所必须的&#xff0c;关键就在于后面三个注解&a…

YOLOv8教程系列:五、关闭数据增强

YOLOv8教程系列&#xff1a;五、关闭数据增强 在一些特殊情况下&#xff0c;特别是在计算机视觉任务中&#xff0c;如目标检测&#xff0c;图像的颜色扰动可能会对算法的性能和稳定性产生重要影响。在这些情况下&#xff0c;我们可能需要采取一些措施来关闭部分或全部的数据增…

JAVA IDEA 下载

超简单步骤一&#xff1a; IntelliJ IDEA 官方下载链接 点击以上链接进入下图&#xff0c;点击下载 继续点下载&#xff0c;然后等待下载完后打开安装包即可 步骤二&#xff1a; 打开下好的安装包&#xff0c;点击Browse...我们把它下载到自己喜欢的地方&#xff08;主要是别占…