AAC Advanced Audio Coding(進階音頻編碼)資料整理

來源:互聯網
上載者:User

在網上找了些關於AAC的資料,整理了一下。

1.http://forum.doom9.org/showthread.php?t=68300

該論壇介紹了很多關於音頻解碼的知識,寫得十分詳細,連最基本的有損、無損壓縮之類的概念都介紹,當然還有我們關注的AAC。

2.http://www.tfcc.cn/dvdrip/2006-8-7_14-34-29_2161.html

這篇文章更多是的是對上一網址中的內容的中文翻譯,新內容不多

3.http://www.audiocoding.com/downloads.html

AAC轉碼器的開原始碼,在之前兩篇文章中都有提到。FAAC編碼器,FAAD2是解碼器。FAAD2中的一些工程檔案在VC2008可以直接編譯。

4.http://www.rarewares.org/aac.php

包含了AAC轉碼器的二進位檔案,可以直接運行。

5.http://blog.csdn.net/wlsfling/article/details/5876016

http://mp4tech.net/document/audiocomp/0000207.asp

兩篇文章的內容大部分一樣,介紹了AAC檔案的格式以及解碼流程,寫得很詳細,後一篇有附解碼過程中各模組的流程圖。

6.http://d.wanfangdata.com.cn/Thesis_Y1035282.aspx

萬方上一篇MPEG-4 AAC解碼器在DSP上實現的論文,還沒有看完,對解碼過程以及一些音頻編碼中的名詞講得很詳細,還提出了在DSP上最佳化的思路。

還有一篇題目為《MPEG.2 AAC音頻編碼技術及其軟體解碼器的實現》,提到瞭解碼播放的實現方案,今後可能會用到。

7.http://www.rosoo.net/a/201005/9402.html

提供了ISO/IEC 13818-7 Part 7: Advanced Audio Coding (AAC)ISO/IEC 14496-3 Information technology — Coding of  audio-visual
objects — Part 3: Audio
標準的PDF文檔下載。

13818-7.pdf

14496-3.pdf

幾個常見的問題:

1.何為採樣率和位元速率?

簡單來講,採樣率和位元速率就像是座標軸上的橫縱座標。 橫座標的採樣率表示了每秒鐘的採樣次數。 縱座標的位元速率表示了用數字量來量化類比量的時候的精度。 採樣率類似於動態影像的幀數,比如電影的採樣率是24赫茲,PAL制式的採樣率是25赫茲,NTSC制式的採樣率是30赫茲。當我們把採樣到的一個個靜止畫面再以採樣率同樣的速度回放時,看到的就是連續的畫面。同樣的道理,把以44.1kHZ採樣率記錄的CD以同樣的速率播放時,就能聽到連續的聲音。顯然,這個採樣率越高,聽到的聲音和看到的映像就越連貫。當然,人的聽覺和視覺器官能分辨的採樣率是有限的,基本上高於44.1kHZ採樣的聲音,絕大部分人已經覺察不到其中的分別了。 而聲音的位元就相當於畫面的顏色數,表示每個取樣的資料量,當然資料量越大,回放的聲音越準確,不至於把開水壺的叫聲和火車的鳴笛混淆。同樣的道理,對於畫面來說就是更清晰和準確,不至於把血和西紅柿醬混淆。不過受人的器官的機能限制,16位的聲音和24位的畫面基本已經是普通人類的極限了,更高位元就只能靠儀器才能分辨出來了。比如電話就是3kHZ取樣的7位聲音,而CD是44.1kHZ取樣的16位聲音,所以CD就比電話更清楚。 當你理解了以上這兩個概念,位元速率就很容易理解了。以電話為例,每秒3000次取樣,每個取樣是7位元,那麼電話的位元速率是21000。而CD是每秒44100次取樣,兩個聲道,每個取樣是13位PCM編碼,所以CD的位元速率是44100*2*13=1146600,也就是說CD每秒的資料量大約是144KB,而一張CD的容量是74分等於4440秒,就是639360KB=640MB。

參考連結:http://wenwen.soso.com/z/q114521200.htm ,該文章還介紹了CBR/VBR/ABR相關的概念。

2.ADTS格式的AAC檔案,一幀的大小是多少,如何計算?

1)ADTS header位於每一個aac幀的開頭。
2)每個aac幀的長度固定為1024個sample(可以是1024*n,沒見過n>1的情況)。
3)ADTS header必要重要的位有:採樣率(4bit)、聲道數(3bit)和幀的大小(13bit),這三項總共只有20bit。

參考連結:http://tieba.baidu.com/f?kz=577031287

3.ADTS格式:(參考連結:http://honwsn.itpub.net/post/41648/497237)

ADTS的全稱是Audio Data Transport Stream。是AAC音訊傳輸串流格式。

AAC音頻格式在MPEG-2(ISO-13318-7 2003)中有定義。AAC後來又被採用到MPEG-4標準中。

1. adts_sequence()

{

while (nextbits() == syncword) {

adts_frame();

}

}

2. adts_frame()

{
adts_fixed_header();

adts_variable_header();

if (number_of_raw_data_blocks_in_frame == 0) {

adts_error_check();

raw_data_block();

}

else {

adts_header_error_check();

for (i = 0; i <= number_of_raw_data_blocks_in_frame; i++) {

raw_data_block();

adts_raw_data_block_error_check();

}

}

}

3.

adts_fixed_header()

{
syncword; 12 bslbf

ID; 1 bslbf

layer; 2 uimsbf

protection_absent; 1 bslbf

profile; 2 uimsbf

sampling_frequency_index; 4 uimsbf

private_bit; 1 bslbf

channel_configuration; 3 uimsbf

original/copy; 1 bslbf

home; 1 bslbf

}

adts_variable_header()

{
copyright_identification_bit; 1 bslbf

copyright_identification_start; 1 bslbf

frame_length; 13 bslbf

adts_buffer_fullness; 11 bslbf

number_of_raw_data_blocks_in_frame; 2 uimsfb

}

詳細說明下ADTS頭的重要資料部分:

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

sampling_frequency_index 表示使用的採樣率下標

sampling_frequency_index sampling frequeny [Hz]

0x0 96000

0x1 88200

0x2 64000

0x3 48000

0x4 44100

0x5 32000

0x6 24000

0x7 22050

0x8 16000

0x9 2000

0xa 11025

0xb 8000

0xc reserved

0xd reserved

0xe reserved

0xf reserved

channel_configuration 表示聲道數

frame_length 一個ADTS幀的長度包括ADTS頭和raw data block.

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資料區塊並不是說沒有。
(一個AAC原始幀包含一段時間內1024個採樣及相關資料)

二、封裝AAC為ADTS幀

一個AAC未經處理資料塊長度是可變的,對原始幀加上ADTS頭進行ADTS 的封裝,就形成了ADTS幀。通常我們將得到的AAC原始幀進行封裝後寫入檔案,用常用的播放器如千千靜聽即可播放,這是個驗證AAC資料是否正確的方法。

進行封裝之前,需要瞭解相關參數,如採樣率,聲道數,未經處理資料塊的長度等。

下面是把AAC未經處理資料幀加工為ADTS幀,根據相關參數填寫組成7個位元組的ADTS頭。

The ADTS header is defined below -

unsigned int obj_type = 0;

unsigned int num_data_block = frame_length / 1024;

// include the header length also

frame_length += 7;

/* We want the same metadata */

/* Generate ADTS header */

if(adts_header == NULL) return;

/* Sync point over a full byte */

adts_header[0] = 0xFF;

/* Sync point continued over first 4 bits + static 4 bits

* (ID, layer, protection)*/

adts_header[1] = 0xF9;

/* Object type over first 2 bits */

adts_header[2] = obj_type << 6;//

/* rate index over next 4 bits */

adts_header[2] |= (rate_idx << 2);

/* channels over last 2 bits */

adts_header[2] |= (channels & 0x4) >> 2;

/* channels continued over next 2 bits + 4 bits at zero */

adts_header[3] = (channels & 0x3) << 6;

/* frame size over last 2 bits */

adts_header[3] |= (frame_length & 0x1800) >> 11;

/* frame size continued over full byte */

adts_header[4] = (frame_length & 0x1FF8) >> 3;

/* frame size continued first 3 bits */

adts_header[5] = (frame_length & 0x7) << 5;

/* buffer fullness (0x7FF for VBR) over 5 last bits*/

adts_header[5] |= 0x1F;

/* buffer fullness (0x7FF for VBR) continued over 6 first bits + 2 zeros

* number of raw data blocks */

adts_header[6] = 0xFC;// one raw data blocks .

adts_header[6] |= num_data_block & 0x03; //Set raw Data blocks.

在CMMB中,採用AAC音頻壓縮標準,預設狀況下,編碼參數如下:雙聲道,採樣率24KHZ,幀長變長,碼流可變碼率的碼流,一般採用的AAC profile為AAC-LC。將從CMMB複用幀解析的一個AAC原始幀封裝為ADTS幀的方法如下:

uint8 aac_buf[ADTS_FRAME_SIZE]={0x0ff,0x0f9,0x058,0x80,0,0x1f,0xfc};

從上述7個位元組分析音頻參數如下:

synword--0xfff

ID:0x1--- 1--- MPEG2 identifier,

LAYER--00

protection_absent ---01

profile--01 1 Low Complexity profile (LC) AAC-LC

smaping_freuency_index---0110-->0x06--->採樣率24KHZ

channel_configuration --- aac_buf[3] = 0x08---->2---->雙聲道。。

adts_buffer_fullness--->0x7ff 碼率可變的碼流

現插入長度參數 wDataLen;

void OnAudioAacFrame(byte* data, uint16 wDataLen)

{
unsigned int num_data_block = wDataLen / 1024;

uint16 frame_Length;

frame_Length = wDataLen + 7;

/* frame size over last 2 bits */

aac_buf[3] |= (frame_length & 0x1800) >> 11;// the upper 2 bit

/* frame size continued over full byte */

aac_buf[4] = (frame_length & 0x1FF8) >> 3;// the middle 8 bit

/* frame size continued first 3 bits */

aac_buf[5] |= (frame_length & 0x7) << 5;//the last 3 bit

aac_bug[6] |= num_data_block & 0x03; //Set raw Data blocks.

memcpy(&aac_buf[7],data,wDataLen);

//形成一個ADTS幀寫入檔案。

fwrite(aac_buf,wDataLen+7,sizeof(byte),f_audio);

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.