使用 MediaPlayer 同时播放多个音频文件时产生延迟

creating delay while playing multiple Audio files simultaneously using MediaPlayer

这里存在数量惊人的类似问题,遗憾的是 none 确实帮助了我。

我想同时播放 3 个音频文件,一个是 .wav ,另一个是 .3gp ,另一个是 .mp3 。由于大小超过 1MB ,我不能在这里使用 Android SoundPool 。到目前为止,一切正常,没有任何错误。这是我的代码:

MediaPlayer mp = new MediaPlayer();
MediaPlayer songPlayer = new MediaPlayer();
MediaPlayer voicePlayer = new MediaPlayer();
private String song,voice,text;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_time__date);
    String temp;



    SharedPreferences preferences1 = getSharedPreferences("musicList", MODE_PRIVATE);

    song = preferences1.getString("MUSICONE", "");


    SharedPreferences preferences2 = getSharedPreferences("recordList",MODE_PRIVATE);
    temp = preferences2.getString("VOICEONE","");
    voice = Environment.getExternalStorageDirectory()+"/myAppCache2/"+temp;


    SharedPreferences preferences3 = getSharedPreferences("TextList",MODE_PRIVATE);
    temp=preferences3.getString("ALARMONE","");
    text=Environment.getExternalStorageDirectory()+"/myAppCache/"+temp;


    try {
        mp.setDataSource(text);
        mp.prepare();
        mp.setLooping(true);

        songPlayer.setDataSource(song);
        songPlayer.prepare();
        songPlayer.setLooping(true);

        voicePlayer.setDataSource(voice);
        voicePlayer.prepare();
        voicePlayer.setLooping(true);



    }
    catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (SecurityException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mp.start();
    songPlayer.start();
    voicePlayer.start();
}

现在,我的问题是如何为一个或多个音频文件添加延迟,如果我想在再次循环之前为 voicePlayer 添加 5000 的延迟?

Now, my query is how do I add a delay to one ore more Audio files, Say If I want to add a delay of 5000 for voicePlayer before it loops again?

您可以删除 setLooping 并使用 OnCompletionListener instead. When you get the onCompletion callback, use postDelayed 到 post 再次启动播放器的 Runnable