OGG文件赢得';使用MediaPlayer正确使用Android进行t循环

OGG文件赢得';使用MediaPlayer正确使用Android进行t循环,android,android-mediaplayer,mp3,ogg,Android,Android Mediaplayer,Mp3,Ogg,当尝试循环MP3文件时,我的KitKat和棒棒糖设备上有一个非常非常微小的间隙,但是在一个旧的姜饼手机上,循环之间的间隙更明显。我需要做点什么就够了,所以 经过大量研究,我了解到MP3文件在文件的开头加了一点“填充”,因此,当循环时,它不会产生“干净的循环”,这种效果在较旧/较慢的手机上更为明显(显然) 所以,我读到的建议是切换到使用OGG Vorbis文件。它们没有任何空格/填充和“完美循环” 然而,在多次尝试之后,我使用OGG文件的效果实际上比使用MP3的效果更差-但问题恰恰相反,即当循环应

当尝试循环MP3文件时,我的KitKat和棒棒糖设备上有一个非常非常微小的间隙,但是在一个旧的姜饼手机上,循环之间的间隙更明显。我需要做点什么就够了,所以

经过大量研究,我了解到MP3文件在文件的开头加了一点“填充”,因此,当循环时,它不会产生“干净的循环”,这种效果在较旧/较慢的手机上更为明显(显然)

所以,我读到的建议是切换到使用OGG Vorbis文件。它们没有任何空格/填充和“完美循环”

然而,在多次尝试之后,我使用OGG文件的效果实际上比使用MP3的效果更差-但问题恰恰相反,即当循环应该返回到OGG文件的开始处时,它实际上似乎再次开始,但从大约2或3秒开始(即没有“间隙”,它只是不能正确循环)

我应该指出的是,OGG文件本身看起来还不错,它们以大胆的方式完美地循环

我正在使用两个MediaPlayer对象—一个用于介绍,一个用于主循环,介绍长度约为30秒,主循环长度约为3分钟

我还(对于JellyBean和更高版本的设备)使用setNextMediaPlayer从介绍过渡到主循环-这可以正常工作(或者至少在我测试过的两台设备上可以)-对于pre-JellyBean设备,我将在OnCompletionListener回调方法中启动我的主循环-我只有一个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();
    }
}
public void setDataSource(){
试一试{
loopPlayer.reset();
setDataSource(myContext,Uri.parse。resource://com.me.myapp/“+R.raw.loop”);
loopPlayer.prepare();
loopPlayer.setLooping(true);
introPlayer.reset();
setDataSource(myContext,Uri.parse。resource://com.me.myapp/“+R.raw.intro”);
准备();
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLY\u BEAN){
introPlayer.setNextMediaPlayer(loopPlayer);
loopPlayer.setLooping(true);
}
introPlayer.setOnCompletionListener(此);
}捕获(IllegalArgumentException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(安全异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(非法状态){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}       
}
@凌驾
完成时的公共作废(MediaPlayer mp){
//如果操作系统<果冻豆,则启动循环
if(Build.VERSION.SDK\u INT
您是否尝试过其他方法来播放您的文件?我会尝试这样做:根据官方文件,无间隙播放只是在Jellybean中添加的,所以我猜你运气不好。你可以尝试的一件(复杂的)事情是[将Wav文件解码为字节[]数组](),然后使用一个,你可以手动继续提供正确的字节[]来播放。这将是非常复杂的,我不能作出任何承诺,如果这将工作。。。就我个人而言,我要么提高你的min SDK级别,要么接受那些4年前的设备上的问题。谢谢@jmols,我在问题中提出的问题是OGG文件不会循环回到起点-在任何设备上,无论是新的还是旧的,姜饼还是棒棒糖(见上面第4段),我确实有一个循环MP3的问题,如前所述,但是我在这里要问的是关于循环OGG Vorbis文件的问题。@csenga,谢谢,我会研究你的建议。