AAC共有9種規格,以適應不同的場合的需要:
MPEG-2 AAC LC 低復雜度規格(Low Complexity)--比較簡單,沒有增益控制,但提高了編碼效率,在中等碼率的編碼效率以及音質方面,都能找到平衡點
MPEG-2 AAC Main 主規格
MPEG-2 AAC SSR 可變采樣率規格(Scaleable Sample Rate)
MPEG-4 AAC LC低復雜度規格(Low Complexity)------現在的手機比較常見的MP4文件中的音頻部份就包括了該規格音頻文件
MPEG-4 AAC Main 主規格 ------包含了除增益控制之外的全部功能,其音質最好
MPEG-4 AAC SSR 可變采樣率規格(Scaleable Sample Rate)
MPEG-4 AAC LTP 長時期預測規格(Long Term Predicition)
MPEG-4 AAC LD 低延遲規格(Low Delay)
MPEG-4 AAC HE 高效率規格(High Efficiency)-----這種規格適合用於低碼率編碼,有Nero ACC 編碼器支持
AAC音頻格式有ADIF和ADTS:
ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特征是可以確定的找到這個音頻數據的開始,
不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁盤文件中。
adif格式:

adif_header:

adif_id always:"ADIF"。
ADTS:Audio Data Transport Stream 音頻數據傳輸流。這種格式的特征是它是一個有同步字的比特流,
解碼可以在這個流中任何位置開始。它的特征類似於mp3數據流格式。
adts_header:

adts_fixed_header頭的部分屬性

鏈接:https://www.jianshu.com/p/30856dccd9cb
int getADTSframe(unsigned char* buffer, int buf_size, unsigned char* data, int* data_size) { int size = 0; if (!buffer || !data || !data_size) { return -1; } while (1) { if (buf_size < 7) { return -1; } //Sync words if ((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0)) { size |= ((buffer[3] & 0x03) << 11); //high 2 bit size |= buffer[4] << 3; //middle 8 bit size |= ((buffer[5] & 0xe0) >> 5); //low 3bit break; } --buf_size; ++buffer; } if (buf_size < size) { return 1; } memcpy(data, buffer, size); *data_size = size; return 0; } int simplest_aac_parser(char *url) { int data_size = 0; int size = 0; int cnt = 0; int offset = 0; //FILE *myout=fopen("output_log.txt","wb+"); FILE *myout = stdout; unsigned char *aacframe = (unsigned char *)malloc(1024 * 5); unsigned char *aacbuffer = (unsigned char *)malloc(1024 * 1024); FILE *ifile = fopen(url, "rb"); if (!ifile) { printf("Open file error"); return -1; } printf("-----+- ADTS Frame Table -+------+\n"); printf(" NUM | Profile | Frequency| Size |\n"); printf("-----+---------+----------+------+\n"); while (!feof(ifile)) { data_size = fread(aacbuffer + offset, 1, 1024 * 1024 - offset, ifile); unsigned char* input_data = aacbuffer; while (1) { int ret = getADTSframe(input_data, data_size, aacframe, &size); if (ret == -1) { break; } else if (ret == 1) { memcpy(aacbuffer, input_data, data_size); offset = data_size; break; } char profile_str[10] = { 0 }; char frequence_str[10] = { 0 }; unsigned char profile = aacframe[2] & 0xC0; profile = profile >> 6; switch (profile) { case 0: sprintf(profile_str, "Main"); break; case 1: sprintf(profile_str, "LC"); break; case 2: sprintf(profile_str, "SSR"); break; default: sprintf(profile_str, "unknown"); break; } unsigned char sampling_frequency_index = aacframe[2] & 0x3C; sampling_frequency_index = sampling_frequency_index >> 2; switch (sampling_frequency_index) { case 0: sprintf(frequence_str, "96000Hz"); break; case 1: sprintf(frequence_str, "88200Hz"); break; case 2: sprintf(frequence_str, "64000Hz"); break; case 3: sprintf(frequence_str, "48000Hz"); break; case 4: sprintf(frequence_str, "44100Hz"); break; case 5: sprintf(frequence_str, "32000Hz"); break; case 6: sprintf(frequence_str, "24000Hz"); break; case 7: sprintf(frequence_str, "22050Hz"); break; case 8: sprintf(frequence_str, "16000Hz"); break; case 9: sprintf(frequence_str, "12000Hz"); break; case 10: sprintf(frequence_str, "11025Hz"); break; case 11: sprintf(frequence_str, "8000Hz"); break; default: sprintf(frequence_str, "unknown"); break; } fprintf(myout, "%5d| %8s| %8s| %5d|\n", cnt, profile_str, frequence_str, size); data_size -= size; input_data += size; cnt++; } } fclose(ifile); free(aacbuffer); free(aacframe); return 0; }
鏈接:https://blog.csdn.net/leixiaohua1020/article/details/50535042
