3.2 “頭部”回調函數header()

之所以要加上引號的原因是這個函數從名字上看是用於處理MP3幀頭的,實際情況是真正的幀頭解碼是在mad_header_decode函數中進行的,mad_header_decode函數負責填充struct mad_header結構:

decode_header函數內部是大堆的if…else,將MP3頭部的數據位表示的含義填充進header結構,而mad_timer_set函數精確地計算幀的播放持續時間(duration),這點對統計MP3文件的總播放時間很有幫助,因爲不論MP3文件是恆定編碼率(CBR)還是可變編碼率(VBR),如果逐幀計算duration的話會精確得多。

在前面的關鍵數據結構的章節裏我們介紹過libmad幀頭結構struct mad_header,下面再回過頭來看看以該結構作爲參數的回調函數header(void* , struct mad_header const *)可以做什麼:

 

重寫該函數並初始化到decoder結構後,我們可能做的事情有:

1、  獲得音頻壓縮標準的層信息(layerIIIIII

2、  獲得音頻文件的聲道信息(單聲道、立體聲等)

3、  獲得頻文件的播放碼率(bps

4、  獲得音頻文件的波特率(Hz,典型的是44.1KHz

5、  獲得該幀的CRC校驗計算值(如果啓用了CRC的話)

6、  獲得該幀的CRC校驗目標值(如果有的話)

7、  最重要的是,獲得該幀的播放時常!

以上的數據可以獲得但不能修改,原因很簡單,指針以const形式進行傳遞,還記得const * *constconst * const的區別嗎?

header()回調函數如果存在(這個函數不是必須的,可以被初始化成0NULL)那麼它是緊隨着input()回調函數之後被調用的,如果header()回調函數不存在,說明用戶對header信息不感興趣,那麼連mad_header_decode()函數都不會被調用:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章