SoundPool遇到的坑

其实也不能算坑,只是自己还没认识到的规律。

我有一段程序需要使用soundPool.play播放一段音频,当播放间隔时长较大时,一切正常,但是间隔较小时就出问题了,会出现哑掉的情况,该它响的时候它不响。网上也没有人提相同的问题,解决问题有时就是这样,靠突出奇想、靠猜测,我先看了soundPool下都有哪些函数,看到有个stop函数,我想这是干什么用的呢,就尝试在每次播放一小段时间后调用下stop,然后问题就解决了。

通过调用stop函数解决问题,我猜测,使用soundPool播放音频时,如果一遍没播放完,是不能播放下一遍的。我之前的问题是由于,当播放间隔较小的,这个间隔恰好和音频时长相近,再加上soundPool.play这个函数有个二十毫秒左右的延时,所以就导致了发声的不稳定。

下面是我的代码,播放150毫秒后,就停止

                    // 下面这一句大概造成20毫秒左右的延时
                    int streamId = soundPool.play(soundId, 1, 1, 0, 0, 1.0f);
                    Timer timer = new Timer();
                    TimerTask timerTask = new TimerTask() {
                        @Override
                        public void run() {
                            soundPool.stop(streamId);
                        }
                    };
                    timer.schedule(timerTask, 150);

另外还有一个小坑,使用soundPool播放音频默认是使用的铃声音量,这给用户造成了不变,一会要调媒体音量,一会要调铃声音量,很多用户根本不知道现在的手机有多种音量类型。起初我以为这是soundPool默认的机制,后来才知道是可以设置的,代码如下:

            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_MEDIA) //当用途为媒体(如音乐或电影配乐)时要使用的用途值,如果不设置这个属性,则使用铃声音量进行播放
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();
            soundPool = new SoundPool.Builder()
                    .setMaxStreams(1)
                    .setAudioAttributes(audioAttributes)
                    .build();

setUsage设置我是读了这篇文章才明白了,感谢

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容