ANDORID soundpool 播放无声音 sample 1 not ready

来源:互联网 发布:c 高性能编程 编辑:程序博客网 时间:2024/05/16 00:40

这个问题是因为资源还没有加在后就播放导致

在开发android软件中,经常需要播放多媒体音频文件,通常会采用MediaPlayer类来执行此类操作。但MediaPlayer类占用的资源比较多,对于游戏等应用而言,会带来性能上的降低。在Android中,专门提供了SoundPool类来执行此类音频播放,SoundPool类占用的CPU资源较少、反应较快。

解决方法一:

handler延迟加载

public static void startCameraKacha(Context c) {final SoundPool soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);AudioManager mgr = (AudioManager) c.getSystemService(Context.AUDIO_SERVICE);float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);final float volume = streamVolumeCurrent / streamVolumeMax;final int id = soundPool.load(c, R.raw.kacha, 1);new Handler().postDelayed(new Runnable() {@Overridepublic void run() {soundPool.play(id, volume, volume, 1, 0, 1f);}}, 20);}

解决方法二:

加载完成回调

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {                @Override                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {                    soundPool.play(sampleId, volume, volume, 1, 0, 1f);                }            });

SoundPool常见的一些问题:

SoundPool的用法就不再提了,网上资料多,就说说在实际应用中可能会遇到的一些奇葩的问题,这些问题应该是和底层实现上有关系。1、AudioFlinger could not  create track, status: -12    SoundPool即音效池,在创建的时候 maxStream这个参数代表能够同时播放的最大音效数,这里切忌合理使用,写的太大后会报AudioFlinger could not  create track, status: -12 。。。。一旦报了这个错,你就听不到声音了,呵呵。 2、256个音效       当调用load方法的时候实际就是把音效加载到了 SoundPool中,此时返回的streamId其实就是该音效在SoundPool中的Id,这个ID从0还是1来着(有点记不清了) 递增,不过要注意的是,不要超过  256  这个临界点。也就是说第257个声音加载进去后,调用play方法其实是播不出来的,说不定还会挤掉一些前面加载好的声音。这个256的限制通过查看SDK源码基本就能了解清楚,它底层就那么实现的,用一个类似堆栈来存。  3、unload方法和release方法         如果你音效多,也不要指望unload方法来清除掉一些音效后再load新的进去,虽然unload后音效卸载了,但是前面分给它在SoundPool里面的Id可没有释放掉,也就是说这个时候你load新的进去只会在后面继续累加,然后累加多了就超过256了,然后就就听不到声音,然后就没有然后了。要想彻底清掉前面的音效请使用release方法,它会连内存中占用的资源一起释放掉。   其他还有点什么呢,load需要一点点时间,load后不要马上unload,load ---play--unload的做法并不可取,不要load太大的音效,它只会申请1M的内存空间。SoundPool出错后通常会看到retuen的值是0。



0 0