3

我有很多简短的 .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) {

    }
}

有解决这个问题的方法吗?

4

2 回答 2

1

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

基本思想是将 MP3 文件解码为 PCM 缓冲区,将它们拼接成一个字节数组,然后使用AudioTrack. 无缝 MP3 播放并不真正存在于MediaPlayer. 不过,这可能会让人头疼,而且如果您正在谈论完整的歌曲,则可能会出现记忆问题。对于短片,它可能有效,但SoundPool可能是更好的选择。

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

于 2012-10-19T15:01:47.827 回答
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();
于 2013-06-13T07:13:16.230 回答