• 获取AAC音频的ADTS固定头部信息



    前言

    调试嵌入式设备中播放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;
    	//variable
    	unsigned 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    上述代码通过位操作将adts头部信息全部取出来,其实常用的也就采样率和帧长度,因为aac音频是允许可变码率的,所以每一帧都有可能长度不一样。

    3.采样率索引和值

    在这里插入图片描述

    解析adts信息里的sampling_frequency_index索引,需要找到对应实际的采样率值,以方便设置给解码器。

    4.下载AAC标准文档

    AAC标准文档下载链接


  • 相关阅读:
    PCI认证:为什么它对你的业务至关重要,以及如何成功获得认证?
    从bootstrap源码中学习Sass(一)
    JavaScript ES6函数触发方式,解构和class构造函数
    自学黑客(网络安全),一般人我劝你还是算了吧
    工欲善其事,必先利其器,这5款利器推荐你
    SpringBoot 玩一玩代码混淆,防止反编译代码泄露!
    Spring源码:Bean生命周期(三)
    pytorch建模的三种方式
    小苹果(民间数据)(c++题解)
    MySQL-(6)
  • 原文地址:https://blog.csdn.net/weixin_37926485/article/details/134289453