使用MediaPlayer,使用Android无法正确循环OGG文件

Zip*_*ppy 6 mp3 android ogg android-mediaplayer

当试图循环MP3文件时,我的KitKat和Lollipop设备上存在非常小的差距,但在旧的Gingerbread手机上,循环之间的差距更加明显.这足以让我需要做点什么......

经过大量的研究,我才知道,MP3文件,把"填充"一点点在文件的开始,因此,循环的时候,它并没有给一个"干净循环"和这种效果可能是在旧/较慢更加明显手机(显然).

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

然而,在尝试多次后,我真的开始使用OGG文件更坏的结果比我用MP3的 - 但问题是相反的,即当循环应该回到OGG文件的开始,它实际上似乎重新开始但是从它开始大约2或3秒(即没有'间隙',它只是没有正确循环).

我应该指出OGG文件本身似乎没问题,它们在Audacity中完美循环.

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

我也(对豆形软糖及更高版本的设备),采用setNextMediaPlayer从前奏到主循环过渡-这工作正常(或至少它在我测试过它的两台设备上) -和预杰利贝恩我正在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();
    }
}
Run Code Online (Sandbox Code Playgroud)