媒体播放器延迟启动

时间:2011-02-04 06:18:25

标签: android android-mediaplayer media

我的媒体播放器在闲置一段时间后会延迟启动,也有一段时间不播放音频。

之前我使用的是setDataSource(),但这次我使用的是create()

作为参考,这是我正在使用的代码:

AssetFileDescriptor afd = _context.getResources().openRawResourceFd(this._soundResource.get(this._toBePlayed));
        mp = new MediaPlayer();
        mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
        afd.close();
        mp.setOnPreparedListener(new OnPreparedListener(){

            @Override
            public void onPrepared(MediaPlayer mp) {

                mp.start();
            }
        });
        mp.setOnCompletionListener(new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp) {

                mp.reset();
                mp.release();
            }
        });
        mp.prepareAsync();

4 个答案:

答案 0 :(得分:1)

我也遇到了 start()的延迟问题。我用 onPrepared 中的 mp.seekTo(0) 修复了它:

mp.setOnPreparedListener(new OnPreparedListener(){
    @Override
    public void onPrepared(MediaPlayer mp) {
        mp.seekTo(0);
        mp.start();
    }
});

答案 1 :(得分:0)

我使用FileInputStream。您没有设置 AudioStreamType 。以下是我设置MediaPlayer的方法。

   public void setupMediaPlayer(){
    mp = new MediaPlayer();
    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

    try {
        fis = new FileInputStream(tempFilePath);
        mp.setDataSource(fis.getFD());
        mp.prepare();
        mp.setOnPreparedListener(this);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

tempFilePath 是文件的路径。

我还在这个类中实现了 setOnPreparedListener ,这使我的代码在我看来更具可读性。

也是参考资料的绝佳链接:MediaPlayer State Diagram

答案 2 :(得分:0)

我没有足够的声誉积分来评论mdiener的答案,但是seekTo(0)方法有效,这是我职业生涯中遇到的最奇怪的错误之一。

作为测试,我对Android和iOS上文件的播放时间进行了计时(本地文件,仅播放方法已计时)。 Android总是花费大约100毫秒以上的时间来播放文件。我添加了seekTo(0)代码,现在它们始终在20毫秒之内。

我只能想象prepare()并没有真正准备所有必要的东西,而需要花费一些时间的东西被卸载了,直到文件将要播放。

答案 3 :(得分:-2)

我想如果你愿意改变

mp.prepareAsync();

mp.prepare();

并放

mp.start();
mp.prepare(); 之后

您的代码将起作用。试一试。