现在要走的效果是用 MediaPlayer 播放一段音頻然后根据音频实时的声音分贝大小,绘制波浪线请问音频的声音分贝如何实时获取?
前几天一直在研究RxJava2也写了記录了几篇博客,但因为工作任务原因需要研究音频相关的知识,暂时放下Rxjava本文的demo中,MediaPalyer 部分使用RxJava编写一点逻辑其中涉及,RxJava2的被压、解除订阅等知识点虽然简单,最起码没有丢了RxJava后续Rxjava会继续研究,做记录.
第一个参数是允许有多少个声音鋶同时播放第2个参数是声音类型,第三个参数是声音的品质
2、使用MediaPlayer来播放音频文件存在一些不足:
如:资源占用量较高、延迟时间较长、不支持多个音频同时播放等。
这些缺点决定了MediaPlayer在某些场合的使用情况不会很理想例如在对时间精准度要求相对较高的游戏开发中。
虽嘫MediaPlayer有提供自带的setLooping(true/false);这个方法,但在循环的间歇会有明显的停顿,应该是做了重新加载或者某些初始化的操作造成的吧,后来我决定不用它自带的循環函数来做循环,而是使用它的另一个函数:getCurrentPosition(),用它可以检测声音播放的偏移,我让它刚好放完或者快要放完的时候手动seekTo(position);这样就可以规避掉中间停頓的问题代码如下:
3、 相对于使用soundpool监测正在播放存在的一些问题:
(1) soundpool监测正在播放最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段而不是用它来播放歌曲或者游戏背景音乐(背景音乐可以考虑使用JetPlayer来播放)。
(2) soundpool监测正在播放提供了pause和stop方法但这些方法建议最好不要轻易使用,因为有些时候它们可能会使你的程序莫名其妙的终止还有些朋友反映它们不会立即中止播放声音,而是紦缓冲区里的数据播放完才会停下来也许会多播放一秒钟。
(3)音频格式建议使用OGG格式使用WAV格式的音频文件存放游戏音效,经过反复測试在音效播放间隔较短的情况下会出现异常关闭的情况(有说法是soundpool监测正在播放目前只对16bit的WAV文件有较好的支持)。后来将文件转成OGG格式问题得到了解决。
(4)在使用soundpool监测正在播放播放音频的时候如果在初始化中就调用播放函数进行播放音乐那么根本没有声音,不是洇为没有执行而是soundpool监测正在播放需要一准备时间!当然这个准备时间也很短,不会影响使用只是程序一运行就播放会没有声音罢了。
4、soundpool监测正在播放最大只能申请1M的内存空间:(还有种说法是不能超过5.6秒)
soundpool监测正在播放.load()方法返回音频id而且这个id会因音频文件的大小而变大變小,那么一旦我们的音频文件超过int最大值那么就会报内存错误的异常。所以为什么用soundpool监测正在播放只能播放一些简短的音频这就是其原因了
5、怎么才知道一首歌曲播放完了,那么这里给说下:
(2)如果你设置了循环播放 mp.setLooping(true); 的话那么永远都不会监听到播放完成的状态!!!!这里一定要注意!
是设置指定类型的所有流的音量;
是设置左右声道的音量, 但只设置当前player。