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()函数都不会被调用:

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