AAC音频格式详解和实战解析
AAC音频格式详解和实战解析
一.基本概念
AAC:即MPEG-2 Advanced Audio Coding,分为流格式和文件格式。文件格式主要用于文件存储和文件播放,流格式主要用于流媒体在线播放。
文件格式:adif格式
adif格式
该格式特点:只有开头有一个头部信息,后面都是AAC裸数据。适应磁盘存储和文件播放
流格式:adts_frame格式
adts_frame格式
该格式特点:每一帧数据=固定头(fixed_header)+ 可变头(variable_header)+帧数据(raw_data),适合流媒体在线播放。
流式AAC可以简单理解如下图:
固定头如下:
syncword 同步字The bit string ‘1111 1111 1111’,说明一个ADTS帧的开始。
ID MPEG 标示符, 设置为1.
layer Indicates which layer is used. Set to ‘00’
protection_absent 表示是否误码校验
profile 表示使用哪个级别的AAC,如01 Low Complexity(LC)--- AACLC
sampling_frequency_index 表示使用的采样率下标
channel_configuration 表示声道数
frame_length 一个ADTS帧的长度包括ADTS头和raw data block.
可变头如下:
adts_buffer_fullness 0x7FF 说明是码率可变的码流
number_of_raw_data_blocks_in_frame
表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧.
所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块并不是说没有。
其他字段为定义,可以忽略。
Raw数据块:
一个帧包含1024个采样
Duration算法:
一个AAC原始帧包含一段时间内1024个采样及相关数据。
一个AAC音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样率。总时间t=总帧数x一个AAC音频帧的播放时间
时间t=总帧数x一个AAC音频帧的播放时间
二. 实战演练
1)使用ffmpeg抽取一个mp4文件中的aac音频如下:
ffmpeg.exe -i CCTV-2-dszg-1.mp4 -vn -y -acodec copy audio.aac
2)利用工具分析该aac音频固定头和可变头字段如下:
adts头解析
3)使用程序代码解析
代码语言:javascript复制#include "stdafx.h"
#include
typedef struct _AdtsHeader
{
unsigned int nSyncWord;
unsigned int nId;
unsigned int nLayer;
unsigned int nProtectionAbsent;
unsigned int nProfile;
unsigned int nSfIndex;
unsigned int nPrivateBit;
unsigned int nChannelConfiguration;
unsigned int nOriginal;
unsigned int nHome;
unsigned int nCopyrightIdentificationBit;
unsigned int nCopyrigthIdentificationStart;
unsigned int nAacFrameLength;
unsigned int nAdtsBufferFullness;
unsigned int nNoRawDataBlocksInFrame;
} AdtsHeader;
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fd = fopen("D:\\ffmpeg-4.1-tool\\bin\\audio.aac", "rb+");
if (fd == NULL)
{
printf("fopen is failed,err %d\n", GetLastError());
}
char adts[7];
int adtslen = 7;
int ret = fread(adts, adtslen, 1, fd);
if (ret != 1)
{
printf("fread is failed,err %d\n", GetLastError());
}
char *p = adts;
GetAdtsSpecificConfig(p, &tAdtsHeader);
printf("AAC key param: \n");
printf("id: %d\n", tAdtsHeader.nId);
printf("layer: %d\n", tAdtsHeader.nLayer);
printf("ProtectionAbsent: %d\n", tAdtsHeader.nProtectionAbsent);
printf("Profile: %d\n", tAdtsHeader.nProfile);
printf("SfIndex: %d\n", tAdtsHeader.nSfIndex);
printf("PrivateBit: %d\n", tAdtsHeader.nPrivateBit);
printf("ChannelConfiguration: %d\n", tAdtsHeader.nChannelConfiguration);
printf("Original: %d\n", tAdtsHeader.nOriginal);
printf("nHome: %d\n", tAdtsHeader.nHome);
printf("nCopyrigthIdentificationStart: %d\n", tAdtsHeader.nCopyrigthIdentificationStart);
printf("nAacFrameLength: %d\n", tAdtsHeader.nAacFrameLength);
printf("nAdtsBufferFullness: %d\n", tAdtsHeader.nAdtsBufferFullness);
printf("NoRawDataBlocksInFrame: %d\n", tAdtsHeader.nNoRawDataBlocksInFrame);
getchar();
return 0;
}编译运行结果如下:
由此可见:代码读出来的参数和工具分析参数一致。
随便看看
- 2025-06-25 00:47:52《召唤师》2025盛夏狂欢盛典:跨服巅峰对决与限定皮肤免费领取活动
- 2025-05-29 22:04:47菲尼西雅战记:周年庆典——英雄的集结与冒险
- 2025-05-10 21:25:43偃月之日:2025年5月10日全球玩家狂欢庆典
- 2025-09-29 17:41:11电脑桌面如何设置动态壁纸
- 2025-11-07 08:29:33穿長袖更需要進行腋下脫毛?比較5個腋下脫毛方法及好處
- 2025-06-16 21:47:58永夜降临:奈奥格之影三周年庆典狂欢盛典
- 2025-10-02 01:28:38优信二手车的质量口碑怎么样,优信二手车怎么样?
- 2025-03-31 12:18:32《魔侠传2》2025春季狂欢盛典:勇者集结,挑战极限!
- 2025-09-28 23:03:01好玩的闯关换装游戏有哪些
- 2025-11-14 19:11:56《荷叶圆圆》阅读训练及参考答案
