AAC簡介


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM