使用MediaPlayer

时间:2015-11-16 20:57:13

标签: android android-mediaplayer mp3 ogg

当尝试循环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();
    }
}

0 个答案:

没有答案