Mediaplay:Android后台同时播放多个音频文件

设备/引擎:Mac(11.6)/cocos

开发工具:Android studio(4.1.2)

开发语言:java/c++

开发需求:android后台实现同时播放多个音频:读取所需的音频文件并按要求播放

之前有提到过ios工程有关后台同时播放多个音频的问题,今天开始说一说android工程后台同时播放多个音频文件的问题。

项目前提条件:
1.音频时长较长,并非短促音效
2.项目工程资源文件已打包成obb文件
3.同时播放指定的音频

最先考虑用到的是soundpoolmediaplay,介于项目的前提条件,所以前者并不适用,在项目中也做了尝试,soundpool可以实现同时播放音频,但音频质量会严重受损,且发现后期对音频音量进行控制时也会出现失效的情况,所以不再使用此方法。

Mediaplay是最常用的播放音频的工具,同样也不会让音频质量受损。

1.获取音频文件:
1)播放应用内的音频文件,代码如下:

MediaPlayer mMediaPlayer = new MediaPlayer.create(this,R.raw.xx);

2)播放内存卡的音频文件,代码如下:

MediaPlayer mMediaPlayer = new MediaPlayer.setDataSource("file//mnt/sdcard/Music/xx.mp3");

3)播放网络上的音频文件,代码如下:

MediaPlayer mMediaPlayer = new MediaPlayer.setDataSource(this,Uri.parse("http://192.168.43.135/test.mp3"));

4)播放网络上的音频文件,代码如下:

MediaPlayer mMediaPlayer = new MediaPlayer();
AssetFileDescriptor fd = getAssets().openFd("music.mp3");
mMediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength);

本次项目中的资源文件已做obb打包处理,所以只考虑使用第一种情况,在工程的res下创建raw文件夹,将音频文件放入到文件夹下,文件名必须以字母开头,其它符号只能用下划线,否则无法访问调用。

2.播放音频
因为需要同时播放多个音频,所以需要同时获得多个音频文件。

先说说失败的尝试,分别创建了MediaPlayer的实例化对象数组,音频文件的数组(R.raw.xx类型为int型,只需创建一个返回值为int的类即可,再在程序中调用需要用到的音频文件),发现只能播放一个音频,其余音频没有声响,多次尝试发现播放的音频一方面是无法同时全部播放,另一方面是音频的质量严重也有问题,感觉是音频重叠的问题。

后来尝试创建多个MediaPlayer的公有实例化对象,然后用每个对象去获取一个音频文件,再通过代码来控制播放哪几个音频,这里之所以设置为公有变量,一方面是后期还要对音频进行音量控制操作,另一方面则是私有变量也无法满足同时播放多个音频,会或多或少的缺少一到两个音频文件。

播放音频的代码如下:

mMediaPlayer = MediaPlayer.create(this,R.raw.audio_0);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.start();
mMediaPlayer.setLooping(true);

mMediaPlayer1 = MediaPlayer.create(this,R.raw.audio_1);
mMediaPlayer1.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer1.start();
mMediaPlayer1.setLooping(true);
……

具体播放哪个音频根据项目需求来定。整体下来发现代码部分不是很难,主要是得挨个尝试,看哪种方式更适合,目前测试来看,效果还不错。

希望能给大家带来帮助!!!