多媒体播放器 `MediaPlayer` 的 `seekTo` 方法不一致地从开头播放歌曲。

4

我正在使用安卓的MediaPlayer类来开始播放一首歌曲以某个偏移量为起点。在代码中指定了这个偏移量之后,我播放这首歌曲,希望从那个偏移位置开始听到它,但实际上我听到的是从开头开始播放。请注意以下代码:

    MediaPlayer mplayer = new MediaPlayer();
    mplayer.reset();
    try {
        // For example's sake, specify some known song path
        mplayer.setDataSource("//media/external/audio/media/1");
        // call blocking prepare()
        mplayer.prepare();
    } catch (Exception e) {
    // Keep try/catch simple for example's sake
        e.printStackTrace();
        return;
    }

    // seekTo is an asynchronous operation. Set it's complete callback to play the song once seekTo has completed
    mplayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
        @Override
        public void onSeekComplete(MediaPlayer mp) {
            // Start the song 30 seconds in
            mp.start();
        }
    });
    // Seek to 30 seconds into the song
    mplayer.seekTo(30000);

这段代码在模拟器上运行没有错误(已经测试过Android 1.6、2.1和2.2),但是在某些手机上运行时歌曲会从头播放。我确定在我的Droid Incredible(Android 2.2)上也会发生这种情况。同时,需要注意的是,LogCat中始终会有一些来自MediaPlayer类的输出,说明歌曲的位置确实已经被设置为某个偏移量。我已经调试了几个小时并搜索了论坛,但仍然没有解决方案。请帮忙。

1个回答

2

如果您还没有自己找到,那么这是一个缓冲问题(此处记录了该问题)。尝试跳转到未缓冲的位置会导致从头开始播放。提出的解决方案可以在这里找到(虽然不够优雅,但是几乎是唯一可做的事情)。


感谢您的意见。我认为这些问题不同。您提供的链接中的错误涉及流媒体,并声称在2.2中得到了解决。我描述的错误似乎只影响HTC手机(据我所知)。 - jdgilday
他们声称在2.2中已经修复了这个问题,但是如果你看评论,大多数人仍然有这个问题。我有一个Incredible手机,仍然存在这个问题。你在非HTC手机上测试过吗? - Cameron
在我的HTC Evo上,如果我寻求一个已缓冲或未缓冲的位置,它会从开头重新开始流,并且我会在日志中看到一个StageFright错误。 - HenryAdamsJr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接