最近开发的一个应用里要在底层播放音频数据, 查了一大堆相关资料,最后采用提取libmedia库,调用Audiotrack实现。 之前的一个实现方法是采用openal,但是发现这个东西也确实在游戏音频方面很适合,放在普通的音频播放应用里面就会有一些问题,在我这出现的问题就是切换到后台播放的时候,打开网页或者其他应用进行操作时音频会卡一下,由此可见openal在进行音频播放的时候做了大量处理。 而一开始之所以采用openal是考虑了跨平台, 最后还是本分点就用android 自身的audiotrack来实现吧,后来也验证了在后台播放时那种蛋疼的音频卡顿的问题没有了(^_^)。

 

        记录一下使用AudioTrack遇到的一个问题。使用AudioTrack写数据有两种方式,一种是直接调用write方法,一种是注册回调函数,在回调函数的EVENT_MORE_DATA事件通知里面写数据。我的需求不需要注册回调(会增加复杂度的说~~),所以就直接调用了write方法, 但是~~~~, 蛋疼的问题来了, 呀的阻塞在write方法里了, 各种谷哥度娘都无果, 最后在android 源码里发现了点眉目,android java层的audiotrack调用jni的audiotrack 的实现,也是调用了write方法,但是,却注册了回调函数,并且,回调函数是这么实现的:

 

  1. static void audioCallback(int event, void* user, void *info) { 
  2.  
  3.     if (event == AudioTrack::EVENT_MORE_DATA) { 
  4.         AudioTrack::Buffer* pBuff = (AudioTrack::Buffer*)info; 
  5.         pBuff->size = 0; 
  6.     } 
  7. ...

         我就抱着试一试的心态, 丫的果然如此,这回调用write方法完全正常了。 最后吐个槽,这种地雷TMD有几个蛋也不够疼的~~~~, 谨以此文,mark一下。