当尝试循环MP3文件时,我的KitKat和Lollipop设备上存在非常小的差距,但在旧的Gingerbread手机上,循环之间的差距更明显。这足以让我为此做点什么......
经过大量研究,我了解到MP3文件中添加了一些“填充”文件。因此,在文件的开头,当循环时,它不会给出一个“干净的循环”。这种效果在较旧/较慢的手机上显得更为明显(显然)。
所以,我读到的建议是切换到使用OGG Vorbis文件。它们没有任何空白/填充和完美的循环#。
然而,在多次尝试之后,我实际上使用OGG文件的结果比使用MP3更糟糕 - 但问题恰恰相反,即当循环应该返回到从OGG文件的开始,它实际上似乎又开始了,但距离它大约2或3秒(即没有'间隙',它只是没有正确循环)。
我应该指出OGG文件本身似乎没问题,它们在Audacity中循环 完美 。
我正在使用2个MediaPlayer对象 - 一个用于介绍,一个用于主循环,介绍长度约为30秒,主循环长度约为3分钟。
我也(对于JellyBean和更高版本的设备),使用 setNextMediaPlayer 从简介转换到主循环 - 这可以正常工作(或者至少在两个设备上都可以我已经测试了它) - 对于pre JellyBean设备我在onCompletitionListener回调方法中启动我的主循环 - 我只有一个pre-JB设备,但同样,过渡似乎没问题)。
请注意确定它是否有帮助,但这里有一些代码,尽管问题似乎与Android MediaPlayer处理OGG Vorbis文件的方式有关。
我一直试图让这个循环正常工作近一个星期,所以希望有人之前遇到过这个问题并且可以对它进行一些说明。
public void setDataSource() {
try {
loopPlayer.reset();
loopPlayer.setDataSource(myContext, Uri.parse("android.resource://com.me.myapp/" + R.raw.loop));
loopPlayer.prepare();
loopPlayer.setLooping(true);
introPlayer.reset();
introPlayer.setDataSource(myContext, Uri.parse("android.resource://com.me.myapp/" + R.raw.intro));
introPlayer.prepare();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
introPlayer.setNextMediaPlayer(loopPlayer);
loopPlayer.setLooping(true);
}
introPlayer.setOnCompletionListener(this);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onCompletion(MediaPlayer mp){
//If OS < Jelly Bean, then start loop
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN){
loopPlayer.start();
}
}