AAC音频格式详解和实战解析

您所在的位置:网站首页 m4a是格式等于mp4格式吗 AAC音频格式详解和实战解析

AAC音频格式详解和实战解析

2024-07-09 14:13| 来源: 网络整理| 查看: 265

 AAC音频格式详解和实战解析

一.基本概念

   AAC:即MPEG-2 Advanced Audio Coding,分为流格式和文件格式。文件格式主要用于文件存储和文件播放,流格式主要用于流媒体在线播放。

文件格式:adif格式

https://p9-tt.byteimg.com/large/pgc-image/d38aa3a9c68d47df8c1ba50c8884f6a2adif格式

该格式特点:只有开头有一个头部信息,后面都是AAC裸数据。适应磁盘存储和文件播放

流格式:adts_frame格式

https://p26-tt.byteimg.com/large/pgc-image/2b01274defd845159b8497daf459df0cadts_frame格式

该格式特点:每一帧数据=固定头(fixed_header)+ 可变头(variable_header)+帧数据(raw_data),适合流媒体在线播放。

流式AAC可以简单理解如下图:

https://p26-tt.byteimg.com/large/pgc-image/77aa7bd8c2e94a04b61f2dff4ac4e2ce

固定头如下:

https://p1-tt.byteimg.com/large/pgc-image/c50f4c0f4ef64734a18d2ad4fe579f22

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

https://p26-tt.byteimg.com/large/pgc-image/9e3f7850190a4803aaa5b10f71fe3c8c

sampling_frequency_index 表示使用的采样率下标

https://p6-tt.byteimg.com/large/pgc-image/8bbbdb2467514f3fb544c79e1fd6267b

channel_configuration 表示声道数

frame_length 一个ADTS帧的长度包括ADTS头和raw data block.

可变头如下:

https://p6-tt.byteimg.com/large/pgc-image/a34477b82b754e9f89d67bcad3d87511

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数据块:

https://p6-tt.byteimg.com/large/pgc-image/0c4ebbb26991493db73ae28eac0d3fc3   一个帧包含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音频固定头和可变头字段如下:

https://p6-tt.byteimg.com/large/pgc-image/32eeb80e9ded4d2f9e4061896ecca8e8adts头解析

3)使用程序代码解析

#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; }

编译运行结果如下:

由此可见:代码读出来的参数和工具分析参数一致。

更多更详细资源请关注公众号:AV_Chat



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3