先簡單記錄下最近對AAC音頻學習的打包時間計算以及估算平均幀大小。打包時間,其實是可以音頻處理上通用的;而估算平均幀大小,是由於AAC單個幀的大小並非是固定的,因此估算的是一個平均幀大小。
samples
做音頻,肯定要對samples有所瞭解,其中AAC有以下幾種samples:
PROFILE | SAMPLES |
---|---|
HE-AAC v1/v2 | 2048 |
AAC-LC | 1024 |
AAC-LD/AAC-ELD | 480/512 |
打包時間
打包時間,我們以AAC-LD進行舉例說明,一般在RTP中常用的就是AAC-LD或AAC-ELD。兩者的打包時間有兩種,一個是480,一個是512。以512爲16kHz例進行說明:
16000/512=31.25
也就是說16k的採樣率,一秒內,其需要採樣31.25次。那麼一次的採樣時間,也就是打包時間,就是如下:
1000/31.25=32ms
也就是說,16k,LD/ELD的打包時間其實是32ms。將兩個公式合併下:
32ms=1000*512/16000
也就是:
打包時間=1000*samples/採樣率
但是在與運營商對接這塊,由於傳統的音頻一般採用的是G.711,其打包時間一般是20ms/10ms,一般都是10ms的倍數。而顯然512採樣的AAC-LD/AAC-ELD與20ms/10ms這種轉換並不好轉換。所以很多實用AAC-LD/AAC-ELD並且需要對接都採用的48k以及480的採樣。剛好48k下的480採樣的打包時間爲10ms,可以很好的與G.711這類型的數據做轉換兼容。
估算平均幀大小
接上文,16kHz的採樣率,512採樣,一秒內需要採樣31.25次。如果我們需要的目標帶寬是64kbps。
64000/31.25=2048bits
2048/8=256bytes
也就是目標帶寬64kbps下,16kHz,512採樣,平均一幀的大小是256字節。換算成公式,也就是:
一幀平均大小(bytes)=目標帶寬/(採樣率/samples)/8
一幀平均大小(bytes)=目標帶寬*samples/採樣率/8
其實這個公式,也是適用於G711的,我們將8kHz採樣的64kbps的G711帶入計算:
64000*160/8000/8=160
因爲G711是固定碼率的,所以其每個報文的大小,也就是剛好160bytes了。