如何在Android中播放一系列短mp3文件,它们之间没有差距?

时间:2012-10-19 14:54:58

标签: android android-mediaplayer

我有很多简短的.mp3文件,我想一个接一个地播放..我试图使用onCompletion事件并启动下一个mp3,虽然这会导致2个mp3之间的短暂差距..

以下是代码:

void StartSound() {
    mediaplayer = MediaPlayer.create(this, Uri.parse(FILE_PATH + counter + ".mp3"));

    try {
        mediaplayer.start();
        mediaplayer.setOnCompletionListener(new OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                                     counter++;
                 try {
                  mp.reset();
                  mp.setDataSource(FILE_PATH + counter + ".mp3");
                  mp.prepare();

                 } catch (Exception e) {
                 e.printStackTrace();
                 }
                 mp.start();
            }
        });

    } catch (Exception e) {

    }
}

是否有解决此问题的方法?

2 个答案:

答案 0 :(得分:1)

有一种解决方法,但是否值得麻烦取决于你。

基本思想是将MP3文件解码为PCM缓冲区,将它们拼接成字节数组,并使用AudioTrack进行播放。 MediaPlayer不存在无缝MP3播放。然而,这可能是屁股的痛苦,如果你在谈论完整的歌曲,可能会出现记忆问题。对于短片,它可能有用,但SoundPool可能是更好的选择。

如果您只是想缩小差距,可以尝试在MediaPlayer之前准备以下onCompletionListener个对象。准备下两个,而不是等待完成,这样你就可以更快地开始播放。然后当您点击onCompletion时,您可以翻转您正在使用的对象和start()。在某种程度上,原油双缓冲。

答案 1 :(得分:0)

试试这个:

public class MainActivity extends Activity 
{
    private int[] tracks = {R.raw.explosion,R.raw.pianothingy_one,R.raw.car_horn_x};
    int mCompleted = 0;

 public void onCreate(Bundle savedInstanceState) 
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 MediaPlayer mp = MediaPlayer.create(this, tracks[0]);
 mp.setOnCompletionListener(new OnCompletionListener() 
 {
     @Override
     public void onCompletion(MediaPlayer mp)
     {
         mCompleted++;
         mp.reset();
         if (mCompleted < tracks.length) 
         {
             try
             {
                 AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                 if (afd != null) 
                 {
                     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                     afd.close();
                     mp.prepare();
                     mp.start();
                 }
             }
             catch (Exception ex) 
             {
                ex.printStackTrace();
             }

         } 
         else if (mCompleted>=tracks.length) 
         {
             mCompleted =0;
             try
             {
                 AssetFileDescriptor afd = getResources().openRawResourceFd(tracks[mCompleted]);
                 if (afd != null) 
                 {
                     mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                     afd.close();
                     mp.prepare();
                     mp.start();
                 }
             }
             catch (Exception ex) 
             {
                ex.printStackTrace();
             }
         }
         else
         {
             mCompleted=0;
              mp.release();
              mp = null;
         }

     }
 });

 mp.start();