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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值