2

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

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

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

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

正如音频播放的事实所示,这应该是视频解码器和新的surfaceholder/view.

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

4

4 回答 4

1

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

如果您打印日志,您会发现当您从其他应用程序返回时,surfaceview 已被破坏并再次创建。

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

于 2012-03-31T07:49:41.300 回答
0

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

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

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

于 2010-11-17T15:29:56.830 回答
0

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

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

于 2010-11-17T03:47:13.730 回答
0

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

于 2010-11-17T03:10:02.243 回答