我有8个mp3文件.我必须同时播放它(不是很接近.肯定会).
我使用’AudaCity‘来控制精度.但我的代码没有给我想要的结果……(异步= 30~90 ms)
所以,这是我的代码:
(首次开始玩)
public voID start() {//songInfo.getMediaPlayer() - it's array of MediaPlayers, source already setted for (MediaPlayer player : songInfo.getMediaPlayer()) { try { if (player != null) { player.prepare(); player.seekTo(0); } } catch (Exception ex) { ex.printstacktrace(); } } songInfo.getMediaPlayer()[0] .setonCompletionListener(new OnCompletionListener() { @OverrIDe public voID onCompletion(MediaPlayer mp) { //code for play next setList } }); resume();}
(暂停)
public voID pause() { for (MediaPlayer player : songInfo.getMediaPlayer()) { if (player != null) player.pause(); }}
(暂停后恢复,开始播放(第一种方法))
public voID resume() { int pos = songInfo.getMediaPlayer()[0].getCurrentposition(); long iTime = System.currentTimeMillis(); for (MediaPlayer player : songInfo.getMediaPlayer()) { if (player != null) { player.seekTo(pos + (int)(System.currentTimeMillis()-iTime)); player.start(); } }}
如果我在第一次开始播放它会给我异步~30ms
然后在暂停/恢复后它会发挥完美.
经过大量研究,问题得到了解决.
要同时播放多个曲目,您应该使用AsyncTask并在THREAD_POol_EXECUTOR上执行它.
这该怎么做:
线程类:
class PlayThread extends AsyncTask<MediaPlayer, VoID, VoID>{ @OverrIDe protected VoID doInBackground(MediaPlayer... player) { player[0].start(); return null; }}
媒体播放器:
MediaPlayer[] players = new MediaPlayer[5];//Then set source to each player...//...//Create objects of Thread classPlayThread[] playThreads = new PlayThread[5];for (int i = 0; i < 5; i++) playThreads[i] = new PlayThread();//Set Media Players there and start playfor (int i = 0; i < 5; i++) playThreads[i].executeOnExecutor(AsyncTask.THREAD_POol_EXECUTOR, players[i]);
AsyncTask只能同时执行5个线程,其他将进入队列.
SoundPool缓冲区限制为1Mb,因此根本不是解决方案.
这是非常重要的:
要同时播放更多音轨,您应该将它们混合到1个缓冲区中.
执行此 *** 作的方法:将mp3解码为pcm(以流模式转换为小缓冲区),将其混合到一个字节缓冲区中并将其放入AudioTrack进行播放.
以上是内存溢出为你收集整理的android – 如何使用MediaPlayer同时播放多首曲目?全部内容,希望文章能够帮你解决android – 如何使用MediaPlayer同时播放多首曲目?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)