2014-01-23 376 views
3

我有8個mp3文件。我必須同時播放它(不會,肯定會)
我使用'AudaCity'來控制精度。但我的代碼我以前不給我想要的結果...
(異步= 30〜90毫秒)
所以,這是我的代碼:
(用於第一個開始玩)如何使用MediaPlayer同時播放多個音軌?

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(); 
      } 
     } 
} 

如果我在第一時間開始播放它給了我異步〜30毫秒+
停頓後接着/恢復它起着完美。

回答

4

經過大量研究,問題解決了。 要同時播放多首曲目,您應該使用AsyncTask並在THREAD_POOL_EXECUTOR上執行它。
如何做到這一點:
Thread類

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 class 
PlayThread[] playThreads = new PlayThread[5]; 
for (int i = 0; i < 5; i++) 
    playThreads[i] = new PlayThread(); 
//Set Media Players there and start play 
for (int i = 0; i < 5; i++) 
    playThreads[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, players[i]); 

AsyncTask可以同時執行只有5個線程,其他將要排隊。


SoundPool緩衝區限制是1Mb,所以它不是一個解決方案。


這是非常重要的:
同時播放多音軌,你應該將它們混合到1個緩衝。
要做到這一點:將mp3解碼爲pcm(以流模式下的小緩衝區),將其混合到一個字節緩衝區並將其放到AudioTrack進行播放。

+0

你有沒有試過[SoundPool根據谷歌的開發人員](http://developer.android.com/reference/android/media/SoundPool.html)文件它應該用於播放各種曲目simulatenously,但我在設置時遇到問題。 – commonSenseCode

+0

@cooervo是的,但SoundPool不是一個好的選擇。它只能播放小音頻文件(http://stackoverflow.com/questions/13377604/soundpool-plays-only-first-5-secs-of-file-why) –

+1

@cooervo在我的情況下,我用NDK混音8個解碼mp3文件的緩衝區。 –

相關問題