1. 程式人生 > >計算音訊幀的播放時間(音訊碼流 音訊幀)

計算音訊幀的播放時間(音訊碼流 音訊幀)

音訊碼流(冗餘資料佔的比例):

先簡單講一下對於ADTS header的結構的理解: 

1)ADTS header位於每一個aac幀的開頭,長度一般是7位元組(也可以是9位元組的,沒見過)。 

2)每個aac幀的長度固定為1024個sample(可以是1024*n,沒見過n>1的情況)。 

3)ADTS header中大部分資訊無用,有用的只有取樣率(4bit)、聲道數(3bit)和幀的大小(13bit),這三項總共只有20bit。 

mp4格式會集中存放每一個frame的index,每個index佔4個位元組。但因為mp4本身還有其他tag,所以對於較短的小檔案冗餘依然比ADTS大。

如一個20kpbs的48kHz he-aac語音,如果用ADTS存放,冗餘資料佔的比例可以這麼計算

1、每秒的音訊資料量是20/8=2560 Byte;

2、每秒的音訊幀數是24000/1024=23.4375幀;(由於編碼的aac演算法是he-aac,它自帶sbr技術,因此SBR只有一半的取樣率)待實際驗證

3)每秒ADTS header的大小是7*23.4375=164.0625 Byte 

4) 冗餘資料佔的比例是164.0625 / 2560 = 6.4% 

可見還是相當大的 

mp4格式會集中存放每一個frame的index,每個index佔4個位元組。但因為mp4本身還有其他tag,所以對於較短的小檔案冗餘依然比ADTS大。 


===============================================================================================

取樣頻率是指將模擬聲音波形進行數字化時,每秒鐘抽取聲波幅度樣本的次數。

。正常人聽覺的頻率範圍大約在20Hz~20kHz之間,根據奈奎斯特取樣理論,為了保證聲音不失真,取樣頻率應該在40kHz左右。常用的音訊取樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果採用更高的取樣頻率,還可以達到DVD的音質

對取樣率為44.1kHz的AAC音訊進行解碼時,一幀的解碼時間須控制在23.22毫秒內。

背景知識:

(一個AAC原始幀包含一段時間內1024個取樣及相關資料)根據aac文件

分析:

1 AAC

音訊幀的播放時間=一個AAC幀對應的取樣樣本的個數/取樣頻率(單位為s)

一幀 1024個 sample。取樣率 Samplerate 44100KHz,每秒44100個sample,

所以 根據公式

     音訊幀的播放時間=一個AAC幀對應的取樣樣本的個數/取樣頻率

(NOTE:該時間可作解碼時間的參考,解碼時間應偏差確保在該時間的一定範圍,異常的話,做一定的異常處理)

如,當前AAC一幀的播放時間是= 1024*1000000/44100= 22.32ms(單位為ms)

當前AAC一幀的播放時間是= 1024/44100 = 0.02232 s(單位為秒)=22.32ms(單位為ms)

反過來,如當想通過音訊緩衝多少ms來計算實際應緩衝多少個音訊幀時,可下計算:

比如對48K緩衝300ms需要多少個buffer,

buffer = 一秒內能產生多少個音訊幀(48000/1024) 乘以 時間比例(300/1000) = (48000*300)/(1024*1000) = 14.0625個。

2 MP3

mp3 每幀均為1152個位元組, 則:

frame_duration = 1152 * 1000000 / sample_rate

例如:sample_rate = 44100HZ時, 計算出的時長為26.122ms,這就是經常聽到的mp3每幀播放時間固定為26ms的由來。

===============================================================================================

1 請教大夥
  我只做過 MPEG4視訊流的RTP打包傳輸 接收
  現在加入了音訊採集 所以要傳送 音視訊流
  我想請問大夥 在傳送時 一般的做法是 音視訊流分開發送
  還是 傳送音視訊的合成流?
答案:

 直播考慮實時性的話,就可能要考慮丟視訊包、保音訊包;分開傳輸比較好

點播不考慮實時性、要求同步的話,可以進行緩衝;合併傳輸比較好


 現在的話 對合成流打包 就不需要有什麼講究了吧
 在接收端 解RTP包 在接 分解 filter 再 分別解壓音視訊流