【问题标题】:can a mediaplayer be restarted when the surfaceview is being recreated? (Android)重新创建表面视图时可以重新启动媒体播放器吗? (安卓)
【发布时间】:2010-11-17 02:58:05
【问题描述】:

我有一个活动(比如活动 A),它使用媒体播放器显示视频,在表面视图中呈现。
用例是暂停视频,开始另一个活动(比如活动 B),然后返回活动 A。
Activity A 在去 B 的时候停止但没有销毁,这很好。
表面视图(因为不可见)被破坏(从通知回调中观察到)。
当回到活动 A 并使用 start() 重新启动媒体播放器时,媒体播放器会播放音频,但看不到视频。 Logcat 上会输出类似这样的错误:

11-16 18:14:44.532: ERROR/Overlay(8630): Error = Invalid argument from qbuf

不幸的是,使用 surfaceCreated() 提供的 SurfaceHolder 的新实例并没有帮助(即提供相同的错误)。

我在各种帖子中阅读了一个解决方案,即重置 mediaplayer 并完全重新启动它,但是效率不高,因为最终用户必须在流中等待整个播放器准备 cycle + seekTo last position .

从音频播放的事实可以看出,这应该是视频解码器和新的surfaceholder/view 之间的管道问题。

在恢复活动时恢复视频播放的最佳解决方案(最佳 = 最快)应该是什么?

【问题讨论】:

    标签: android video media-player surfaceview


    【解决方案1】:

    在Android 4下是可以的(对不起,我只有2.3和4.0,3.0没有测试)。使用 Surface 和媒体播放器时,不能更改媒体播放器的表面。视频视图也是如此。

    如果你打印日志,你会发现surfaceview被破坏了,当你从其他应用返回时又被创建了。

    在 Android 4.0 中,您可以更改媒体播放器的表面或表面支架。

    【讨论】:

      【解决方案2】:

      您可以尝试使用 VideoView,因为它包含 Surface 和 MediaPlayer 对象

      【讨论】:

        【解决方案3】:

        请小心,因为活动 A 在历史堆栈中暂停并显示活动 B 时可能会被操作系统杀死。您应该编写代码以期待它。

        如果速度对您很重要,您可能会考虑不启动活动 B,而是隐藏视频视图并在其位置显示另一个视图。

        【讨论】:

          【解决方案4】:

          谢谢。处理活动可能因为系统需要资源而被破坏的事实是可以的。

          我可以选择顶部的视图。然后我需要处理用户按返回键返回视频...

          从 ht 媒体播放器的行为来看,确实似乎缺少一些东西以使其按预期工作,即音频又回来了(这意味着 a/v 的解复用正在正确发生),我猜这只是管道问题在视频解码器和视频渲染器之间。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-02-03
            • 1970-01-01
            • 2011-09-03
            • 1970-01-01
            • 2011-02-03
            • 1970-01-01
            相关资源
            最近更新 更多