之所以要加上引號的原因是這個函數從名字上看是用於處理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、 獲得音頻壓縮標準的層信息(layerI、II、III)
2、 獲得音頻文件的聲道信息(單聲道、立體聲等)
3、 獲得頻文件的播放碼率(bps)
4、 獲得音頻文件的波特率(Hz,典型的是44.1KHz)
5、 獲得該幀的CRC校驗計算值(如果啓用了CRC的話)
6、 獲得該幀的CRC校驗目標值(如果有的話)
7、 最重要的是,獲得該幀的播放時常!
以上的數據可以獲得但不能修改,原因很簡單,指針以const形式進行傳遞,還記得const * 與*const、const * const的區別嗎?
header()回調函數如果存在(這個函數不是必須的,可以被初始化成0或NULL)那麼它是緊隨着input()回調函數之後被調用的,如果header()回調函數不存在,說明用戶對header信息不感興趣,那麼連mad_header_decode()函數都不會被調用: