生活随笔
收集整理的這篇文章主要介紹了
AAC音频基础知识及码流解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AAC音頻基礎知識及碼流解析
目錄
AAC簡介 AAC規格簡介 AAC特點 AAC音頻文件格式及代碼解析 AAC元素信息 AAC文件處理流程 AAC解碼流程 技術解析
1. AAC簡介
AAC是高級音頻編碼(Advanced Audio Coding) 的縮寫,出現于1997年,最初是基于MPEG-2的音頻編碼技術。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同開發,目的是取代MP3格式。2000年,MPEG-4標準出現后,AAC重新集成了其特性,加入了SBR技術和PS技術,為了區別于傳統的MPEG-2 AAC又稱為MPEG-4 AAC。
AAC是新一代的音頻有損壓縮技術,它通過一些附加的編碼技術(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三 種主要的編碼,LC-AAC就是比較傳統的AAC,相對而言,主要用于中高碼率(>=80Kbps),HE-AAC(相當于AAC+SBR)主要用于中低碼(<=80Kbps),而新近推出的HE-AACv2(相當于AAC+SBR+PS)主要用于低碼率(<=48Kbps),事實上大部分編碼器設成<=48Kbps自動啟用PS技術,而>48Kbps就不加PS,就相當于普通的HE-AAC。
音頻碼流在視頻播放器中的位置如下所示。
2. AAC規格簡介
AAC共有9種規格,以適應不同的場合的需要,目前使用最多的是LC和HE(適合低碼率)。
MPEG-4 AAC LC低復雜度規格(Low Complexity)------現在的手機比較常見的MP4文件中。 MPEG-4 AAC HE 高效率規格(High Efficiency)-----這種規格適合用于低碼率編碼,有Nero ACC 編碼器支持 流行的Nero AAC編碼程序只支持LC,HE,HEv2這三種規格,編碼后的AAC音頻,規格顯示都是LC。HE其實就是AAC(LC)+SBR技術,HEv2就是AAC(LC)+SBR+PS技術;
HE:“High Efficiency”(高效性)。HE-AAC v1(又稱AACPlusV1,SBR),用容器的方法實現了AAC(LC)+SBR技術。SBR其實代表的是Spectral Band Replication(光譜帶復制)。簡要敘述一下,音樂的主要頻譜集中在低頻段,高頻段幅度很小,但很重要,決定了音質。如果對整個頻段編碼,若是為了保護高頻就會造成低頻段編碼過細以致文件巨大;若是保存了低頻的主要成分而失去高頻成分就會喪失音質。SBR把頻譜切割開來,低頻單獨編碼保存主要成分,高頻單獨放大編碼保存音質,“統籌兼顧”了,在減少文件大小的情況下還保存了音質,完美的化解這一矛盾。
HEv2:用容器的方法包含了HE-AAC v1和PS技術。PS指“parametric stereo”(參數立體聲)。原來的立體聲文件文件大小是一個聲道的兩倍。但是兩個聲道的聲音存在某種相似性,根據香農信息熵編碼定理,相關性應該被去掉才能減小文件大小。所以PS技術存儲了一個聲道的全部信息,然后,花很少的字節用參數描述另一個聲道和它不同的地方。
3. AAC特點
AAC是一種高壓縮比的音頻壓縮算法,但它的壓縮比要遠超過較老的音頻壓縮算法, 如AC-3、MP3等。并且其質量可以同未壓縮的CD音質相媲美。
同其他類似的音頻編碼算法一樣,AAC也是采用了變換編碼算法,但AAC使用了分辨率更高的濾波器組,因此它可以達到更高的壓縮比。
AAC使用了臨時噪聲重整、后向自適應線性預測、聯合立體聲技術和量化哈夫曼編碼等最新技術,這些新技術的使用都使壓縮比得到進一步的提高。
AAC支持更多種采樣率和比特率、支持1個到48個音軌、支持多達15個低頻音軌、具有多種語言的兼容能力、還有多達15個內嵌數據流。
AAC支持更寬的聲音頻率范圍,最高可達到96kHz,最低可達8KHz,遠寬于MP3的16KHz-48kHz的范圍。
不同于MP3及WMA,AAC幾乎不損失聲音頻率中的甚高、甚低頻率成分,并且比WMA在頻譜結構上更接近于原始音頻,因而聲音的保真度更好。專業評測中表明,AAC比WMA聲音更清晰,而且更接近原音。
AAC采用優化的算法達到了更高的解碼效率,解碼時只需較少的處理能力。
4. AAC音頻文件格式
1. AAC的音頻文件格式有ADIF & ADTS:
ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特征是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁盤文件中。 AAC的ADIF格式見下圖: **ADTS:Audio Data Transport Stream 音頻數據傳輸流。**這種格式的特征是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特征類似于mp3數據流格式。 簡單說,ADTS可以在任意幀解碼,也就是說它每一幀都有頭信息。ADIF只有一個統一的頭,所以必須得到所有的數據后解碼。且這兩種的header的格式也是不同的,目前一般編碼后的和抽取出的都是ADTS格式的音頻流。 有的時候當你編碼AAC裸流的時候,會遇到寫出來的AAC?件并不能在PC和?機上播放,很?的可能就是AAC?件的每?幀?缺少ADTS頭信息?件的包裝拼接,只需要加?頭?件ADTS即可。 ?個AAC原始數據塊?度是可變的,對原始幀加上ADTS頭進?ADTS的封裝,就形成了ADTS幀。 AAC的ADTS的一般格式見下圖: 圖中表示出了ADTS一幀的簡明結構,其兩邊的紫色矩形表示一幀前后的數據。
2. ADIF和ADTS的header
1. ADIF 的頭信息:
ADIF頭信息位于AAC文件的起始處,接下來就是連續的 raw data blocks。 組成ADIF頭信息的各個域如下所示:
2. AAC?頻?件的每?幀由ADTS Header和AAC Audio Data組成。結構體如下:
每?幀的ADTS的頭?件都包含了?頻的采樣率,聲道,幀?度等信息,這樣解碼器才能解析讀取。 ?般情況下ADTS的頭信息都是7個字節,分為2部分: adts_fixed_header(); adts_variable_header(); 其?為固定頭信息,緊接著是可變頭信息。固定頭信息中的數據每?幀都相同,?可變頭信息則在幀與幀之間可變
1. ADTS 的固定頭信息:
syncword :同步頭 總是0xFFF, all bits must be 1,代表著?個ADTS幀的開始 ID:MPEG標識符,0標識MPEG-4,1標識MPEG-2 Layer:always: ‘00’ protection_absent:表示是否誤碼校驗。Warning, set to 1 if there is noCRC and 0 if there is CRC profile:表示使?哪個級別的AAC,如01 Low Complexity(LC)— AAC LC。有些芯?只?持AAC LC 在MPEG-2 AAC中定義了3種 profile的值等于 Audio Object Type的值減1,profile = MPEG-4 Audio Object Type - 1 sampling_frequency_index:表示使?的采樣率下標,通過這個下標在Sampling Frequencies[ ]數組中查找得知采樣率的值。 channel_configuration: 表示聲道數,?如2表示?體聲雙聲道
0 : Defined in AOT Specifc Config
1 : 1 channel
: front
- center
2 : 2 channels
: front
- left
, front
- right
3 : 3 channels
: front
- center
, front
- left
, front
- right
4 : 4 channels
: front
- center
, front
- left
, front
- right
, back
- center
5 : 5 channels
: front
- center
, front
- left
, front
- right
, back
- left
, backright
6 : 6 channels
: front
- center
, front
- left
, front
- right
, back
- left
, backright
, LFE
- channel
7 : 8 channels
: front
- center
, front
- left
, front
- right
, side
- left
, side
- right
, back
- left
, back
- right
, LFE
- channel
8 - 15 : Reserved
2. ADTS的可變頭信息:
frame_length : ?個ADTS幀的?度包括ADTS頭和AAC原始流.
frame length, this value must include 7 or 9 bytes of header length: aac_frame_length = (protection_absent == 1 ? 7 : 9) + size(AACFrame) protection_absent=0時, header length=9bytes protection_absent=1時, header length=7bytes
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數據塊。
下?是ADTS的AAC?件部分:
第?幀的幀頭7個字節為:0xFF 0xF1 0x4C 0x40 0x20 0xFF 0xFC 分析各個關鍵數值:
計算幀?度:將?進制 0000100000111 轉換成?進制為263。觀察第?幀的?度確實為263個字節。計算?法:(幀?度為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_bit
>> 5 ) ; len += ( m_bit
<< 3 ) ; len += ( ( f_bit
& 3 ) << 11 ) ; return len ;
}
幀同步目的在于找出幀頭在比特流中的位置,13818-7規定,aac ADTS格式的幀頭同步字為12比特的“1111 1111 1111”.
ADTS的頭信息為兩部分組成,其一為固定頭信息,緊接著是可變頭信息。固定頭信息中的數據每一幀都相同,而可變頭信息則在幀與幀之間可變。
代碼解析
#include
< stdio
. h
>
#include
< libavutil
/ log
. h
>
#include
< libavformat
/ avio
. h
>
#include
< libavformat
/ avformat
. h
> #define ADTS_HEADER_LEN
7 ; const int sampling_frequencies
[ ] = { 96000 , 88200 , 64000 , 48000 , 44100 , 32000 , 24000 , 22050 , 16000 , 12000 , 11025 , 8000
} ; 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 ; int adtsLen
= data_length
+ 7 ; int 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 ; p_adts_header
[ 1 ] = 0xf0 ; p_adts_header
[ 1 ] |= ( 0 << 3 ) ; p_adts_header
[ 1 ] |= ( 0 << 1 ) ; p_adts_header
[ 1 ] |= 1 ; p_adts_header
[ 2 ] = ( profile
) << 6 ; p_adts_header
[ 2 ] |= ( sampling_frequency_index
& 0x0f ) << 2 ; p_adts_header
[ 2 ] |= ( 0 << 1 ) ; p_adts_header
[ 2 ] |= ( channels
& 0x04 ) >> 2 ; p_adts_header
[ 3 ] = ( channels
& 0x03 ) << 6 ; p_adts_header
[ 3 ] |= ( 0 << 5 ) ; p_adts_header
[ 3 ] |= ( 0 << 4 ) ; p_adts_header
[ 3 ] |= ( 0 << 3 ) ; p_adts_header
[ 3 ] |= ( 0 << 2 ) ; p_adts_header
[ 3 ] |= ( ( adtsLen
& 0x1800 ) >> 11 ) ; p_adts_header
[ 4 ] = ( uint8_t
) ( ( adtsLen
& 0x7f8 ) >> 3 ) ; p_adts_header
[ 5 ] = ( uint8_t
) ( ( adtsLen
& 0x7 ) << 5 ) ; p_adts_header
[ 5 ] |= 0x1f ; p_adts_header
[ 6 ] = 0xfc ; return 0 ;
} int main ( int argc
, char
* argv
[ ] ) { int ret
= - 1 ; char errors
[ 1024 ] ; char
* in_filename
= "/Users/lijinwang/Downloads/course/study/believe.mp4" ; char
* aac_filename
= "/Users/lijinwang/Downloads/course/study/believe.aac" ; FILE
* aac_fd
= NULL
; int audio_index
= - 1 ; int len = 0 ; AVFormatContext
* ifmt_ctx
= NULL
; AVPacket pkt
; av_log_set_level ( AV_LOG_DEBUG
) ; aac_fd
= fopen ( aac_filename
, "wb" ) ; if ( ! aac_fd
) { av_log ( NULL
, AV_LOG_DEBUG
, "Could not open destination file %s\n" , aac_filename
) ; return - 1 ; } if ( ( ret
= avformat_open_input ( & ifmt_ctx
, in_filename
, NULL
, NULL
) ) < 0 ) { av_strerror ( ret
, errors
, 1024 ) ; av_log ( NULL
, AV_LOG_DEBUG
, "Could not open source file: %s, %d(%s)\n" , in_filename
, ret
, errors
) ; return - 1 ; } if ( ( ret
= avformat_find_stream_info ( ifmt_ctx
, NULL
) ) < 0 ) { av_strerror ( ret
, errors
, 1024 ) ; av_log ( NULL
, AV_LOG_DEBUG
, "failed to find stream information: %s, %d(%s)\n" , in_filename
, ret
, errors
) ; return - 1 ; } av_dump_format ( ifmt_ctx
, 0 , in_filename
, 0 ) ; av_init_packet ( & pkt
) ; audio_index
= av_find_best_stream ( ifmt_ctx
, AVMEDIA_TYPE_AUDIO
, - 1 , - 1 , NULL
, 0 ) ; if ( audio_index
< 0 ) { av_log ( NULL
, AV_LOG_DEBUG
, "Could not find %s stream in input file %s\n" , av_get_media_type_string ( AVMEDIA_TYPE_AUDIO
) , in_filename
) ; return AVERROR ( EINVAL
) ; } printf ( "audio profile:%d, FF_PROFILE_AAC_LOW:%d\n" , ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > profile
, FF_PROFILE_AAC_LOW
) ; if ( ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > codec_id
!= AV_CODEC_ID_AAC
) { printf ( "the media file no contain AAC stream, it's codec_id is %d\n" , ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > codec_id
) ; goto failed
; } while
( av_read_frame ( ifmt_ctx
, & pkt
) >= 0 ) { if ( pkt
. stream_index
== audio_index
) { char adts_header_buf
[ 7 ] = { 0 } ; adts_header ( adts_header_buf
, pkt
. size
, ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > profile
, ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > sample_rate
, ifmt_ctx
- > streams
[ audio_index
] - > codecpar
- > channels
) ; fwrite ( adts_header_buf
, 1 , 7 , aac_fd
) ; len = fwrite ( pkt
. data
, 1 , pkt
. size
, aac_fd
) ; if ( len != pkt
. size
) { av_log ( NULL
, AV_LOG_DEBUG
, "warning, length of writed data isn't equal pkt.size(%d, %d)\n" , len , pkt
. size
) ; } } av_packet_unref ( & pkt
) ; } failed
: if ( ifmt_ctx
) { avformat_close_input ( & ifmt_ctx
) ; } if ( aac_fd
) { fclose ( aac_fd
) ; } return 0 ;
}
結果
5. AAC元素信息
1. 在AAC中,原始數據塊的組成可能有七種不同的元素:
SCE: Single Channel Element單通道元素。單通道元素基本上只由一個ICS組成。一個原始數據塊最可能由16個SCE組成。
CPE: Channel Pair Element 雙通道元素,由兩個可能共享邊信息的ICS和一些聯合立體聲編碼信息組成。
CCE: Coupling Channel Element 藕合通道元素。代表一個塊的多通道聯合立體聲信息或者多語種程序的對話信息。
LFE: Low Frequency Element 低頻元素。包含了一個加強低采樣頻率的通道。
DSE: Data Stream Element 數據流元素,包含了一些并不屬于音頻的附加信息。
PCE: Program Config Element 程序配置元素。包含了聲道的配置信息。它可能出現在ADIF 頭部信息中。
FIL: Fill Element 填充元素。包含了一些擴展信息。如SBR,動態范圍控制信息等。
6. AAC文件處理流程
判斷文件格式,確定為ADIF或ADTS
若為ADIF,解ADIF頭信息,跳至第6步。
若為ADTS,尋找同步頭。
解ADTS幀頭信息。
若有錯誤檢測,進行錯誤檢測。
解塊信息。
解元素信息。
7. AAC解碼流程
在主控模塊開始運行后,主控模塊將AAC比特流的一部分放入輸入緩沖區,通過查找同步字 得到一幀的起始,找到后,根據ISO/IEC 13818-7所述的語法開始進行Noisless Decoding(無噪解碼),無噪解碼實際上就是哈夫曼解碼,通過反量化(Dequantize)、聯合立體聲(Joint Stereo),知覺噪聲替換(PNS),瞬時噪聲整形(TNS),反離散余弦變換(IMDCT),頻段復制(SBR)這幾個模塊之后,得出左右聲道的PCM碼流,再由主控模塊將其放入輸出緩沖區輸出到聲音播放設備。
8. 技術解析
1. 主控模塊:
所謂的主控模塊,它的主要任務是操作輸入輸出緩沖區,調用其它各模塊協同工作。 其中,輸入輸出緩沖區均由DSP控制模塊提供接口。 輸出緩沖區中將存放的數據為解碼出來的PCM數據,代表了聲音的振幅。它由一塊固定長度的緩沖區構成,通過調用DSP控制模塊的接口函數,得到頭指針,在完成輸出緩沖區的填充后,調用中斷處理輸出至I2S接口所連接的音頻ADC芯片(立體聲音頻DAC和DirectDrive耳機放大器)輸出模擬聲音。
2. Noisless Decoding(無噪解碼):
無噪編碼就是哈夫曼編碼,它的作用在于進一步減少尺度因子和量化后頻譜的冗余,即將尺度因子和量化后的頻譜信息進行哈夫曼編碼。 全局增益編碼成一個8位的無符號整數,第一個尺度因子與全局增益值進行差分編碼后再使用尺度因子編碼表進行哈夫曼編碼。 后續的各尺度因子都與前一個尺度因子進行差分編碼。 量化頻譜的無噪編碼有兩個頻譜系數的劃分。 其一為4元組和2元組的劃分,另一個為節劃分。對前一個劃分來說,確定了一次哈夫曼表查找出的數值是4個還是2個。對后一個劃分來說,確定了應該用哪一個哈夫曼表,一節中含有若干的尺度因子帶并且每節只用一個哈夫曼表。
2.1 分段
無噪聲編碼將輸入的1024個量化頻譜系數分為幾個段(section),段內的各點均使用同一個哈夫曼表,考慮到編碼效率,每一段的邊界最好同尺度因子帶的邊界重合。所以每一段必需段傳送信息應該有:段長度,所在的尺度因子帶,使用的哈夫曼表。
2.2 分組和交替
分組是指忽略頻譜系數所在窗,將連續的,具有相同尺度因子帶的頻譜系數分為一組放在一起,共享一個尺度因子從而得到更好的編碼效率。 這樣做必然會引起交替,即本來是以c[組][窗][尺度因子帶][ 系數索引] 為順序的系數排列,變為將尺度因子相同的系數放在一起: c[組][尺度因子帶][窗][ 系數索引] 這樣就引起了相同窗的系數的交替。
2.3 大量化值的處理
大量化值在AAC中有兩種處理方法:在哈夫曼編碼表中使用escape標志或使用脈沖escape方法。 前者跟mp3編碼方法相似,在許多大量化值出現時采用專門的哈夫曼表,這個表暗示了它的使用將會在哈夫曼編碼后面跟跟一對escape值及對值的符號。 在用脈沖escape方法時,大數值被減去一個差值變為小數值,然后使用哈夫曼表編碼,后面會跟一個脈沖結構來幫助差值的還原.
3. 尺度因子解碼及逆量化
在AAC編碼中,逆量化頻譜系數是由一個非均勻量化器來實現的,在解碼中需進行其逆運算。 即保持符號并進行4/3次冪運算。
在頻域調整量化噪聲的基本方法就是用尺度因子來進行噪聲整形。尺度因子就是一個用來改變在一個尺度因子帶的所有的頻譜系數的振幅增益值。使用尺度因子這種機制是為了使用非均勻量化器在頻域中改變量化噪聲的比特分配。
3.1 尺度因子帶(scalefactor-band)
頻率線根據人耳的聽覺特性被分成多個組,每個組對應若干個尺度因子,這些組就叫做尺度因子帶。為了減少信息含有短窗的邊信息,連續的短窗可能會被分為一組,即將若干個短窗當成一個窗口一起傳送,然后尺度因子將會作用到所有分組后的窗口去。
4. 聯合立體聲(Joint Stereo)
聯合立體聲的是對原來的取樣進行的一定的渲染工作,使聲音更”好聽”些。
5. 知覺噪聲替換(PNS)
知覺噪聲替換模塊是一種以參數編碼的方式模擬噪聲的模塊。在判別出音頻值中的噪聲后,將那些噪聲不進行量化編碼,而是采用一些參數告訴解碼器端這是某種噪聲,然后解碼器端將會對這些噪聲用一些隨機的編碼來制造出這一類型的噪聲。
在具體操作上,PNS模塊對每個尺度因子帶偵測頻率4kHz以下的信號成分。如果這個信號既不是音調,在時間上也無強烈的能量變動,就被認為是噪聲信號。其信號的音調及能量變化都在心理聲學模型中算出。
在解碼中,如果發現使用了哈夫曼表13(NOISE_HCB),則表明使用了PNS。由于M/S立體聲解碼與PNS解碼互斥,故可以用參數ms_used來表明是否兩個聲道都用同樣的PNS。如果ms_used參數為1,則兩個聲道會用同樣的隨機向量來生成噪聲信號。PNS的能量信號用noise_nrg來表示,如果使用了PNS,則能量信號將會代替各自的尺度因子來傳送。噪聲能量編碼同尺度因子一樣,采用差分編碼的方式。第一個值同樣為全局增益值。它同強度立體聲位置值及尺度因子交替地放在一起,但對差分解碼來說又彼此忽略。即下一個噪聲能量值以上一個噪聲能量值而不是強度立體聲位置或尺度因子為標準差分解碼。隨機能量將會在一個尺度 因子帶內產生noise_nrg所計算出的平均能量分布。此項技術只有在MPEG-4 AAC中才會使用。
6. 瞬時噪聲整形(TNS)
這項神奇的技術可以通過在頻率域上的預測,來修整時域上的量化噪音的分布。在一些特殊的語音和劇烈變化信號的量化上,TNS技術對音質的提高貢獻巨大!
TNS瞬態噪聲整形用于控制一個轉換窗口內的瞬時噪聲形態。它是用一個對單個通道的濾波過程來實現的。傳統的變換編碼方案常常遇到信號在時域變化非常劇烈的問題,特別是語音信號,這個問題是因為量化后的噪聲分布雖然在頻率域上得到控制,但在時域上卻以一個常數分布在一個轉換塊內。如果這種塊中信號變化得很劇烈卻又不轉向一個短塊去,那這個常數分布的噪聲將會被聽到。
TNS的原理利用了時域和頻域的二元性和LPC(線性預測編碼)的時頻對稱性,即在其中的任意一個域上做編碼與在另一域上做預測編碼等效,也就是說,在一個域內做預測編碼可以在另一域內增加其解析度。量化噪聲產生是在頻域產生的,降低了時域的解析度,故在這里是在頻域上做預測編碼。在AACplus中,由于基于AAC profile LC,故TNS的濾波器階數被限制在 12階以內。
7. 反離散余弦變換(IMDCT)
將音頻數據從頻域轉換到時域的過程主要是由將頻域數據填入一組IMDCT濾波器來實現的。在進行IMDCT變換后,輸出數值經過加窗,疊加,最后得到時域數值。
8. 頻段復制(SBR)
簡要敘述,音樂的主要頻譜集中在低頻段,高頻段幅度很小,但很重要,決定了音質。 如果對整個頻段編碼,若是為了保護高頻就會造成低頻段編碼過細以致文件巨大;若是保存了低頻的主要成分而失去高頻成分就會喪失音質。 SBR把頻譜切割開來,低頻單獨編碼保存主要成分,高頻單獨放大編碼保存音質,“統籌兼顧”了,在減少文件大小的情況下還保存了音質,完美的化解這一矛盾。
9. 參數立體聲(PS)
對于之前的立體聲文件來說,其文件大小是單聲道的兩倍,但是兩個聲道的聲音存在某種相似性,根據香農信息熵編碼定理,相關性應該被去掉才能減小文件大小。所以PS技術存儲了一個聲道的全部信息,之后,用很少的字節當作參數來描述另一個聲道和它不同的地方。
參考博客:AAC文件格式解析
總結
以上是生活随笔 為你收集整理的AAC音频基础知识及码流解析 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。