个人网站介绍源码,国内十大高端定制西服品牌,河北省保定市雄县,百度广告优化师一、AAC音频格式种类有哪些
AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIF#xff08;Audio Data Interchange Format音频数据交换格式#xff09;和ADTS#xff08;Audio Data transport Stream音频数据传输流#xff09;。
ADIF 特点…一、AAC音频格式种类有哪些
AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIFAudio Data Interchange Format音频数据交换格式和ADTSAudio Data transport Stream音频数据传输流。
ADIF 特点可以确定的找到音视频数据的开始不需要进行在音视频数据流中间开始的解码它的解码必须在明确的定义开始。
应用场景常用在磁盘文件中。
ADTS 特点具有同步字的比特流解码可以在这个流中任何位置开始。类似于mp3数据流格式。
应用场景应用比较广泛可用于网络直播等。
二、ADIF和ADTS的区别 ADTS每一帧都有头信息因此可以在任意帧解码 ADIF只有一个头信息需要得到所有的数据后才能解码。
三、AAC文件头信息 ADTS的头信息分为固定头信息(adts_fixed_header,28bits)和可变头信息(adts_variable_header,28bits)两部分。 下面是iso13818-7 的说明. 固定头:syncword 同步头代表着1个ADTS帧的开始所有bit置1即 0xFFF IDMPEG标识符0标识MPEG-41标识MPEG-2 Layer 直接置00,解码时忽略这个参数protection_absent表示是否误码校验。1 no CRC , 0 has CRCprofileAAC 编码级别, 0: Main Profile, 1:LC(最常用), 2: SSR, 3: reserved.sampling_frequency_index采样率标识,重要 Private bit直接置0解码时忽略这个参数channel_configuration: 声道数标识,重要 original_copy: 直接置0解码时忽略这个参数 home:直接置0解码时忽略这个参数
重点关注: 1. sample_freq_index : 4代表44100hz 2. channel_configuration: 2表示双声道
可变头: copyright_identification_bit: 直接置0解码时忽略这个参数 copyright_identification_start: 直接置0解码时忽略这个参数aac_frame_lenght: 当前音频帧的字节数. 重要 adts_buffer_fullness: 当设置为0x7FF时表示时可变码率 number_of_raw_data_blocks_in_frames: 当前音频包里面包含的音频编码帧数,为0代表1frame. 四、帧长度计算方法帧长度为13位使用unsigned int来存储帧长数值
unsigned int getFrameLength(unsigned char* str)
{if ( !str ){return 0;}unsigned int len 0;int f_bit str[3];int m_bit str[4];int b_bit str[5];len (b_bit5);len (m_bit3);len ((f_bit3)11);return len;
}五、ADTS header封装源码
const int sampling_frequencies[] {96000, // 0x088200, // 0x164000, // 0x248000, // 0x344100, // 0x432000, // 0x524000, // 0x622050, // 0x716000, // 0x812000, // 0x911025, // 0xa8000 // 0xb// 0xc d e f是保留的
};int adts_header(char * const p_adts_header, const int data_length,const int profile, const int samplerate,const int channels)
{int sampling_frequency_index 3; // 默认使用48000hzint adtsLen data_length 7; //这里不做校验直接7个字节用于存放ADTS headerint frequencies_size sizeof(sampling_frequencies) / sizeof(sampling_frequencies[0]);int i 0;for(i 0; i frequencies_size; i){if(sampling_frequencies[i] samplerate){sampling_frequency_index i;break;}}if(i frequencies_size){printf(unsupport samplerate:%d\n, samplerate);return -1;}p_adts_header[0] 0xff; //syncword:0xfff 高8bitsp_adts_header[1] 0xf0; //syncword:0xfff 低4bitsp_adts_header[1] | (0 3); //MPEG Version:0 for MPEG-4,1 for MPEG-2 1bitp_adts_header[1] | (0 1); //Layer:0 2bitsp_adts_header[1] | 1; //protection absent:1 1bitp_adts_header[2] (profile)6; //profile:profile 2bitsp_adts_header[2] | (sampling_frequency_index 0x0f)2; //sampling frequency index:sampling_frequency_index 4bitsp_adts_header[2] | (0 1); //private bit:0 1bitp_adts_header[2] | (channels 0x04)2; //channel configuration:channels 高1bitp_adts_header[3] (channels 0x03)6; //channel configuration:channels 低2bitsp_adts_header[3] | (0 5); //original0 1bitp_adts_header[3] | (0 4); //home0 1bitp_adts_header[3] | (0 3); //copyright id bit0 1bitp_adts_header[3] | (0 2); //copyright id start0 1bitp_adts_header[3] | ((adtsLen 0x1800) 11); //frame lengthvalue 高2bitsp_adts_header[4] (uint8_t)((adtsLen 0x7f8) 3); //frame length:value 中间8bitsp_adts_header[5] (uint8_t)((adtsLen 0x7) 5); //frame length:value 低3bitsp_adts_header[5] | 0x1f; //buffer fullness:0x7ff 高5bitsp_adts_header[6] 0xfc; //11111100 //buffer fullness:0x7ff 低6bits// number_of_raw_data_blocks_in_frame// 表示ADTS帧中有number_of_raw_data_blocks_in_frame 1个AAC原始帧。return 0;
}