我有很多简短的.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) {
}
}
是否有解决此问题的方法?
答案 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();