【问题标题】:MediaPlayer completes after pausingMediaPlayer 暂停后完成
【发布时间】:2011-05-29 01:56:21
【问题描述】:

我最近发现 MediaPlayer 播放 mp3 文件时出现了一个非常奇怪的问题。我正在运行这段代码(mPlayer 是一个 MediaPlayer):

Log.d(TAG, "Pausing");
try {
    mPlayer.pause();
    Log.d(TAG, "Paused");
} catch (IllegalStateException e) {
    Log.w(TAG, "exception pausing player");
}

奇怪的是,如果我接近音频文件的结尾,播放器会在上述代码完成后不久向我的OnCompletionListener 发送完成通知。 (我还没有确切地确定我必须有多接近,但它大约是 1/4 秒。)例如,这是发生这种情况时的典型 logcat 输出:

05-27 17:23:43.439: DEBUG/Player(266): Pausing
05-27 17:23:43.487: DEBUG/Player(266): Paused
05-27 17:23:43.838: WARN/Player(266): Audio completed (state=PAUSED)

请注意,警告行(从我的OnCompletionListener 记录)在对pause() 的调用返回后超过 300 毫秒出现!

结果是媒体播放器在我没想到的时候进入了PlaybackCompleted状态。这搞砸了我的代码的行为(以及start(),它从头重新开始,而不是播放文件的最后一点)。

从 1.6 到 2.3 的模拟器以及至少一台运行 2.2 的设备上都发生过这种情况。有谁知道这个问题以及如何解决?

【问题讨论】:

    标签: android mp3 media-player


    【解决方案1】:

    媒体播放器在单独的线程中运行,您必须等到 ui 线程和媒体播放器的线程同步。所以延迟是正常的。播放器可能真的完成了文件,因为您的暂停命令太迟到达播放器。尝试使用较长的音频文件会发生什么。

    另一个可能出现的问题是在暂停命令之后寻找超出轨道末尾的其他代码。你的监听器的代码是什么?

    【讨论】:

    • 我很害怕这样的事情,尽管 350 毫秒似乎是应用程序和媒体播放器之间的巨大延迟。音频文件的长度不是问题......这是用户尝试暂停它的距离有多近。 (在我看来,音频播放在结束前就被切断了,但我不能肯定地说,因为从结束后暂停超过 1/4 秒没有问题。)我的完成听众非常很简单:它检查一个字段,该字段指示我的代码认为播放器应该处于什么状态,并在存在差异时记录警告。没有其他代码寻求;我也记录下来。
    • 如果用户暂停音频,比方说距离结束 5 秒,会发生什么?你在这里做什么,你也接到一个完整的电话吗?
    • 一切都按预期运行。在我发布的代码完成后,我设置了我的内部标志以指示我已暂停播放器,我没有收到完成通知,并且当我调用 start() 时,它会从暂停的位置恢复。这只发生在非常接近声音文件末尾的暂停时。
    • 那么我相信它就像我想的那样:由于在您发出暂停命令时音频结束的延迟。当 OnCompleted 触发但您处于暂停状态时,您处理这种情况是否有问题?
    • 这是我的代码现在组织方式的问题,但我会想办法解决它。我只是不知道到底发生了什么。我想你成功了。
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多