目錄
前言??
?01 AAC是什么?
?02 為什么需要進行AAC進行音頻壓縮處理?
?03 AAC的特點以及優勢
?04 AAC格式詳解:
4.1. ADIF的數據結構:
4.1.1 ADIF Header具體的表格:
4.2. ADTS的結構(重點):
4.2.2. adts_fixed_header的表格如下:
4.2.3. adts_variable_header的表格如下:
前言??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
從本章開始我們將要學習嵌入式音視頻的學習了 ,使用的瑞芯微的開發板
🎬 個人主頁:@ChenPi
🐻推薦專欄1: 《C++_@ChenPi的博客-CSDN博客》????
🔥 推薦專欄2: 《Linux C應用編程(概念類)_@ChenPi的博客-CSDN博客》???
🛸推薦專欄3:《嵌入式音視頻_@ChenPi的博客-CSDN博客》
🌺本篇簡介 ?:這章記錄音頻的基礎知識學習
?01 AAC是什么?
AAC中文名稱是高級音頻編碼技術,它是基于MPEG-2的一種全新的音頻編碼技術。而隨著時代的發展, 目前AAC的技術升級到MPEG-4標準。它廣泛運用在網絡傳輸、高清錄制等領域,而AAC技術的出現就是為了取代之前的MP3格式。
?02 為什么需要進行AAC進行音頻壓縮處理?
由于一幀普通的PCM數據傳輸的比特率都非常高,以采樣率48000、采樣通道2、采樣格式S16的PCM數據進行傳輸。假設采集10分鐘就是100多M,這樣的大小在網絡傳輸顯然是不可取的。所以此時我們就需要引入AAC音頻編碼進行壓縮,在經過AAC壓縮過后原本需要100多M的音頻數據可能就需要幾M就可以傳輸了。
?03 AAC的特點以及優勢
3.1.高壓縮率:AAC的壓縮率高達1:20,遠遠高于MP3的1:10。換言之,在相同時間內錄制AAC的文件大小遠遠低于MP3的大小。
3.2.更高的音頻品質:AAC的優勢不僅在于壓縮大小上,還在于它的音頻還原程度更高,音質相比于其他壓縮格式更加優秀。
3.3.更高的解碼效率:解碼播放器在解碼含有AAC的音頻編碼的時候,它所占用的資源會更加的少,解碼時CPU使用率更低。
?04 AAC格式詳解:
AAC有兩種不同的表現形式,一個是ADIF形式,另外一種是ADTS形
- ????ADIF形式:這種格式的特點是可以確定這個音頻數據的開始位置,而且不需要在中間位置進行解碼。所以這種形式的AAC文件適合存儲在磁盤中。
- ADTS格式存儲的AAC文件的特點是可以在任意幀進行解碼,換言之就是在ADTS格式每一幀都有頭信息,下面我們用兩張圖來區分兩種形式的不同
4.1. ADIF的數據結構:
??
4.1.1 ADIF Header具體的表格:
??
4.2. ADTS的結構(重點):
??
從這張圖可以出,一個普通的ADTS幀由兩部分組成。一個是ADTS Header,另外一個是AAC ES,ADTS Header是頭部信息,AAC ES是AAC的裸流數據。下面我們先來重點看看ADTS Header的具體信息
ADTS Header由兩部分組成一個是adts_fixed_header,另外一個是adts_variable_header。
4.2.2. adts_fixed_header的表格如下:
- syncword :固定為0xFFF,代表著?個ADTS幀的開始
- id:MPEG標識符,0標識MPEG-4,1標識MPEG-2
- layer:默認為00
- protection_absent:表示是否誤碼校驗。
- profile:表示使?哪個級別的AAC,下面這個表格是profile的索引:
Sample?Frequence?index:代表的是使用的是采樣率下標,通過這個下標找到對應的采樣率,如下圖:
private bit:私有位,編碼的時候設置為0,解碼的時候忽略這個
channel?configuration:聲道數的配置,下面是聲道數的配置表格
1:單聲道
2:雙聲道
3:三聲道
4:四聲道
5:五聲道
6:六聲道
7:八聲道
8-15:reserved
copy: 編碼時設置為0,解碼的時候忽略
home:編碼時設置為0,解碼的時候忽略
4.2.3. adts_variable_header的表格如下:
- copyright_identificaion_bit:編碼時設置為0
- copyright_identificaion_start:編碼時設置為0
- aac_frame_length:ADTS幀的長度,它包含adts length和aac es的長度。所以aac_frame_length=-(protection_absent == 0 ? 9:7) + audio_data_length
- adts_buffer_fullness:固定為0x7FF。這個標識符是指可變的碼流
- number_of_raw_data_blocks_in_frame表示當前的幀有number_of_raw_data_blocks_in_frame + 1 個原始幀