AAC ADTS格式分析

news/2024/5/20 1:33:04/文章来源:https://blog.csdn.net/m0_60565784/article/details/131252398

标题

  • 1.AAC简介
  • 2. AAC ADTS格式分析
    • 2.1 adts_fixed_header详细介绍
    • 2.2 adts_variable_header详细介绍

1.AAC简介

AAC音频格式:Advanced Audio Coding(⾼级⾳频解码),是⼀种由MPEG-4标准定义的有损⾳频压缩格式,由Fraunhofer发展,Dolby, SonyAT&T是主要的贡献者。

  • ADIF:Audio Data Interchange Format ⾳频数据交换格式。这种格式的特征是可以确定的找到这个⾳频数据的开始,不需进⾏在⾳频数据流中开始的解码,即它的解码必须在明确定义的开始处进⾏。故这种格式常⽤在磁盘⽂件中。
  • ADTS的全称是Audio Data Transport Stream。是AAC⾳频的传输流格式。AAC⾳频格式在MPEG-2(ISO-13318-7 2003)中有定义。AAC后来⼜被采⽤到MPEG-4标准中。这种格式的特征是它是⼀个有同步字的⽐特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

简单说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的头,所以必须得到所有的数据后解码。

且这两种的header的格式也是不同的,⽬前⼀般编码后的和抽取出的都是ADTS格式的⾳频流。两者具体的组织结构如下所示:
在这里插入图片描述

2. AAC ADTS格式分析

AAC音频文件每一帧都是由ADTS Header 和AAV Audio Data组成.

详细了解一下ADTS Header的构成:

ADTS Header由adts_fixed_header()和adts_variable_header()构成,
也就是说ADTS Header由一个固定头信息和可变头信息.

2.1 adts_fixed_header详细介绍

在这里插入图片描述
固定大小28bit
在FFmpeg源码中:

  /* adts_fixed_header */put_bits(&pb, 12, 0xfff);   /* syncword */put_bits(&pb, 1, 0);        /* ID */put_bits(&pb, 2, 0);        /* layer */put_bits(&pb, 1, 1);        /* protection_absent */put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */put_bits(&pb, 4, ctx->sample_rate_index);put_bits(&pb, 1, 0);        /* private_bit */put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */put_bits(&pb, 1, 0);        /* original_copy */put_bits(&pb, 1, 0);        /* home */

我们仔细看一下各个变量的含义:
syncword:0xfff 这是一个同步头,也就是代表着一个ADTS帧的开始
ID:用来标识MEPG的,0标识MPEG-4,1标识MPEG-2
layer: 总是0
protection_absent:表示是否误码校验,1是没有,0是有
profile:表示使用哪个级别的AAC,一共有4中

static const int aacenc_profiles[] = {FF_PROFILE_AAC_MAIN,FF_PROFILE_AAC_LOW,FF_PROFILE_AAC_LTP,FF_PROFILE_MPEG2_AAC_LOW,
};

AudioObjectType=profile+1,这是因为在AudioObjectType中0代表的是AOT_NULL,而profile是从0开始的,因此他们之间相差1个位置

enum AudioObjectType {AOT_NULL,// Support?                NameAOT_AAC_MAIN,              ///< Y                       MainAOT_AAC_LC,                ///< Y                       Low ComplexityAOT_AAC_SSR,               ///< N (code in SoC repo)    Scalable Sample RateAOT_AAC_LTP,               ///< Y                       Long Term PredictionAOT_SBR,                   ///< Y                       Spectral Band ReplicationAOT_AAC_SCALABLE,          ///< N                       ScalableAOT_TWINVQ,                ///< N                       Twin Vector QuantizerAOT_CELP,                  ///< N                       Code Excited Linear PredictionAOT_HVXC,                  ///< N                       Harmonic Vector eXcitation CodingAOT_TTSI             = 12, ///< N                       Text-To-Speech InterfaceAOT_MAINSYNTH,             ///< N                       Main SynthesisAOT_WAVESYNTH,             ///< N                       Wavetable SynthesisAOT_MIDI,                  ///< N                       General MIDIAOT_SAFX,                  ///< N                       Algorithmic Synthesis and Audio EffectsAOT_ER_AAC_LC,             ///< N                       Error Resilient Low ComplexityAOT_ER_AAC_LTP       = 19, ///< N                       Error Resilient Long Term PredictionAOT_ER_AAC_SCALABLE,       ///< N                       Error Resilient ScalableAOT_ER_TWINVQ,             ///< N                       Error Resilient Twin Vector QuantizerAOT_ER_BSAC,               ///< N                       Error Resilient Bit-Sliced Arithmetic CodingAOT_ER_AAC_LD,             ///< N                       Error Resilient Low DelayAOT_ER_CELP,               ///< N                       Error Resilient Code Excited Linear PredictionAOT_ER_HVXC,               ///< N                       Error Resilient Harmonic Vector eXcitation CodingAOT_ER_HILN,               ///< N                       Error Resilient Harmonic and Individual Lines plus NoiseAOT_ER_PARAM,              ///< N                       Error Resilient ParametricAOT_SSC,                   ///< N                       SinuSoidal CodingAOT_PS,                    ///< N                       Parametric StereoAOT_SURROUND,              ///< N                       MPEG SurroundAOT_ESCAPE,                ///< Y                       Escape ValueAOT_L1,                    ///< Y                       Layer 1AOT_L2,                    ///< Y                       Layer 2AOT_L3,                    ///< Y                       Layer 3AOT_DST,                   ///< N                       Direct Stream TransferAOT_ALS,                   ///< Y                       Audio LosslesSAOT_SLS,                   ///< N                       Scalable LosslesSAOT_SLS_NON_CORE,          ///< N                       Scalable LosslesS (non core)AOT_ER_AAC_ELD,            ///< N                       Error Resilient Enhanced Low DelayAOT_SMR_SIMPLE,            ///< N                       Symbolic Music Representation SimpleAOT_SMR_MAIN,              ///< N                       Symbolic Music Representation MainAOT_USAC_NOSBR,            ///< N                       Unified Speech and Audio Coding (no SBR)AOT_SAOC,                  ///< N                       Spatial Audio Object CodingAOT_LD_SURROUND,           ///< N                       Low Delay MPEG SurroundAOT_USAC,                  ///< N                       Unified Speech and Audio Coding
};

sampling_frequency_index:表示使用的采样率下标

static const int mpeg4audio_sample_rates[16] = {96000, 88200, 64000, 48000, 44100, 32000,24000, 22050, 16000, 12000, 11025, 8000, 7350
};

channel_configuration:表示声道数

2.2 adts_variable_header详细介绍

在这里插入图片描述

/* adts_variable_header */
put_bits(&pb, 1, 0);        /* copyright_identification_bit */
put_bits(&pb, 1, 0);        /* copyright_identification_start */
put_bits(&pb, 13, full_frame_size); /* aac_frame_length */
put_bits(&pb, 11, 0x7ff);   /* adts_buffer_fullness */
put_bits(&pb, 2, 0);        /* number_of_raw_data_blocks_in_frame */

aac_frame_length :代表ADTS帧大小,header+aac原始数据大小长度

protection_absent: 为0则headerlength=9bytes,为1则headerlength=7bytes

adts_buffer_fullness:0x7FF 说明是码率可变的码流。
number_of_raw_data_blocks_in_frame :表示ADTS帧中有number_of_raw_data_blocks_in_frame +1个AAC原始帧

我打开一个aac文件二进制文件:
在这里插入图片描述
图中红色框框就是ADTS的header
FF F1 4C 80 2B 9F FC
通过分析工具:
在这里插入图片描述

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

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

相关文章

【炫酷登录界面】详解5款高级的前端登录页面及实现源码(附完整源码)

【写在前面】 其实好早之前我就想写这篇文章了&#xff0c;也有些网友还会私信我&#xff0c;说有时候公司要求登录页面的改造&#xff0c;问我能不能出一期关于登录页的文章&#xff0c;于是乎我也是拖到这个时候才整理出来&#xff0c;其实每篇文章的效果内容我都是自己亲自去…

java【抽象类与接口】

抽象类与接口 1 抽象类1.1 定义与使用1.2 抽象类和抽象方法使用原则 2 接口2.1 定义2.2 使用规则 3. JDK中内置接口3.1 Comparable接口3.2 Cloneable接口 抽象类与接口的对比 前言&#xff1a;如果强制要求子类必须覆写一些方法&#xff0c;则就会用到抽象类和抽象方法 1 抽象类…

OpenCV 笔记_5

文章目录 笔记_5特征点匹配DMatch 存放匹配结果DescriptorMatcher::match 特征点描述子&#xff08;一对一&#xff09;匹配DescriptorMatcher::knnMatch 特征点描述子&#xff08;一对多&#xff09;匹配DescriptorMatcher::radiusMatch 特征点描述子&#xff08;一对多&#…

C语言之指针详解(8)

目录 本章重点 1. 字符指针 2. 数组指针 3. 指针数组 4. 数组传参和指针传参 5. 函数指针 6. 函数指针数组 7. 指向函数指针数组的指针 8. 回调函数 9. 指针和数组面试题的解析 指针和数组笔试题解析 #include<stdio.h> int main() {//一维数组int a[] { 1,2,…

flv 报错 Unsupported codec in video frame: 12

视频播放器播放 flv 报错 [TransmuxingController] > DemuxException: type CodecUnsupported, info Flv: Unsupported codec in video frame: 12 原因 主要是因为我们的播放器不支持 H.265 视频编码&#xff1b; 解决办法 方法一&#xff1a;将设备端的视频编码改为 …

瑞萨RA系列mcu学习笔记--RTT-pwm驱动

方案1&#xff1a;Studio 2.2.6和使用了RASC3.5下使用pwm驱动 开发环境必须说一下&#xff0c;本人在在开发环境的问题上栽了一个跟头&#xff0c; 使用最新版的RTT Studio 2.2.6和使用了RASC4.0的版本生成的公共编译ok&#xff0c;但是一下载到mcu就直接不能运行&#xff1a…

记录一下RocketMQ中遇见的 连环大坑!!!差点没把我摔死

目录 环境&#xff1a;Win10 &#xff0c; 不是 linux 首先我遇见的第一个问题是&#xff1a; No route info of this topic 问题原因&#xff1a; PS&#xff1a; 64位系统环境下&#xff0c;如果软件在安装时安装路径默认c:\progarmfiles即为64位&#xff0c;默认c:\pr…

【备战秋招】每日一题:5月13日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第三题-火车调度 在线评测链接:P1288 题目描述 塔子哥是一位火车车厢调度员。 这一天&#xff0c;一列带有 n 个编号车厢的列车进站了&#xff0c;编号为 1\rightarrow …

kafka 报错 - Cannot assign requested address

背景 在华为云服务器上跑了 zookeeper 和 kafka 的 broker&#xff0c;想内外网分流&#xff0c;重点就是做不到从外网去消费&#xff0c;比如用自己的 windows 笔记本去消费。 配置 server.properties 的 listener 为 broker 所在机子的的内网 IP 后&#xff0c;终于能 star…

ECC算法学习(一)算法公式

ECC 一、ECC简介优缺点运用 二、算法理论基础1. 椭圆曲线的加法2. 椭圆曲线的二倍运算3. 同余运算4. 有限域5. 乘法逆元 三、算法公式1、有限域的负元2、有限域的加法&#xff0c; P Q P Q PQ3. 斜率计算&#xff08;PQ即要计算P点切线&#xff0c;需要求导&#xff09;4. 椭…

【位图布隆过滤器海量数据面试题】

文章目录 1 位图2 布隆过滤器 1 位图 首先我们来看看一个腾讯的面试题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 分析&#xff1a; 40亿个不重复整形数据&#xff0c;大概有160亿字节…

Axios和Spring MVC[前端和后端的请求和响应处理]

在前后端交互中&#xff0c;Axios和Spring MVC扮演着不同的角色&#xff0c;分别负责前端和后端的请求和响应处理。它们之间的作用如下&#xff1a; Axios&#xff08;前端&#xff09;&#xff1a; 发送HTTP请求&#xff1a;前端使用Axios库发送HTTP请求到后端。可以使用Axi…

机器学习实践(1.1)XGBoost分类任务

前言 XGBoost属于Boosting集成学习模型&#xff0c;由华盛顿大学陈天齐博士提出&#xff0c;因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络&#xff0c;XGBoost能更好的处理表格数据&#xff0c;并具有更强的可解释性&#xff0c;还具有易于调参…

hard fault on thread: mqtt0解决办法

rt thread版本4.1.0 使用paho mqtt软件包 运行一段时间后出现 psr: 0x21000000 r00: 0x5036fc8f r01: 0x5036fc88 r02: 0x00000000 r03: 0x5036fc8f r04: 0x00000007 r05: 0x00000063 r06: 0x00005f70 r07: 0x2001f1d8 r08: 0xdeadbeef r09: 0xdeadbeef r10: 0xdeadbeef r11…

关于Java SSM框架的面试题

一、Spring面试题 1、Spring 在ssm中起什么作用&#xff1f; Spring&#xff1a;轻量级框架作用&#xff1a;Bean工厂&#xff0c;用来管理Bean的生命周期和框架集成。两大核心&#xff1a;1、IOC/DI(控制反转/依赖注入) &#xff1a;把dao依赖注入到service层&#xff0c;se…

28.vite

目录 1 一些概念 1.1 单页面应用程序SPA 1.2 vite 2 初始化vite项目 3 项目中的文件 1 一些概念 1.1 单页面应用程序SPA 单页面应用程序是只有一个页面的前端&#xff0c;切换页面通过前端路由来切换 特点如下 实现了前后端分离&#xff0c;后端仅出接口&#…

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述&#xff1a; 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

YOLOv5-7.0添加解耦头

Decoupled Head Decoupled Head是由YOLOX提出的用来替代YOLO Head&#xff0c;可以用来提升目标检测的精度。那么为什么解耦头可以提升检测效果呢&#xff1f; 在阅读YOLOX论文时&#xff0c;找到了两篇引用的论文&#xff0c;并加以阅读。 第一篇文献是Song等人在CVPR2020发表…

【59天|503.下一个更大元素II ● 42. 接雨水】

503.下一个更大元素II class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;int n nums.size();vector<int> res (n, -1);for(int i0; i<2*n;i){while(!st.empty()&&nums[i%n]>nums[st.t…

随机的乐趣和游戏

1、猜数字游戏 #GuessingGame.py import random the_number random.randint(1, 10) print("计算机已经在1到10之间随机生成了一个数字&#xff0c;") guess int(input("请你猜猜是哪一个数字: ")) while guess ! the_number:if guess > the_number:p…