之所以要加上引号的原因是这个函数从名字上看是用于处理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()函数都不会被调用: