7

每当我尝试加载至少 4 个媒体播放器时,其中一个会破坏它尝试加载的视频并触发 Android 操作系统消息“无法播放此视频”

其他信息:

对于 3 个 mediaPlayers,一切正常。

在其他 Android 版本上,与 4.2 不同,相同的代码具有相同的 4 个视频工作。

4个视频可以在设备上独立播放。没有格式问题。

启动程序并收到“无法播放此视频”消息后,除非我重置设备,否则无法再在任何其他应用程序中播放该视频。

我在surfaceViews上显示的VideoViews或独立的MediaPlayers都试过了。

我在更多运行 Android 4.2 的设备上复制了该错误。在 android 4.1.2 和其他 android 4 版本上,我不记得代码工作正常。

4

1 回答 1

1

在 Android 上,这个想法是所有与媒体编解码器相关的内容都对开发人员隐藏,开发人员必须使用一致且独特的 API MediaPlayer:.

当您播放媒体时,无论是流还是位于外部设备上的东西,每次应用程序需要帮助时都会实例化低级编解码器/解析器。

但是,由于与硬件解码相关的特殊原因,某些编解码器不能多次实例化。事实上,每个应用程序都必须MediaPlayer.release()通过在有效状态下调用来释放不再需要的资源(例如编解码器实例) 。

事实上,我所说的在 Android 开发者网站上的文档中有说明:release

释放与此 MediaPlayer 对象关联的资源。使用完 MediaPlayer 后调用此方法被认为是一种很好的做法。特别是,每当应用程序的 Activity 暂停(调用其 onPause() 方法)或停止(调用其 onStop() 方法)时,应调用此方法以释放 MediaPlayer 对象,除非应用程序有特殊的需要保持对象周围。除了占用不必要的资源(例如内存和编解码器的实例)外,如果不再需要 MediaPlayer 对象,则未能立即调用该方法还可能导致移动设备持续消耗电池,如果没有,其他应用程序播放失败设备上支持同一编解码器的多个实例。

因此,要么您在播放完毕后没有调用release,要么另一个应用程序正在持有此类资源的引用。

编辑 :

如果您需要同时渲染多个视频Activity,您有两种选择。正如我在回复中所说,由于低级问题,您最初想要的东西是不可能的,顺便说一句,它也不在 iOS 上。

你可以尝试做的是:

  • 如果您正在播放的媒体不是实时流媒体内容,您可以使用广泛可用的免费视频编辑器之一将 4 个视频打包成一个视频。然后在你的活动中全屏渲染视频,它看起来就像你有 4 Views

  • 如果它们是实时/非录制内容,请保持第一个视频不变。我假设每个视频都使用相同的编解码器/容器进行编码。您可能正在尝试对其他 3 个视频进行转码,以便它们使用不同的编解码器和不同的格式。确保您正在转码为Android 支持的编解码器/容器。这可能会迫使 Android 同时使用不同的解码器。我认为与您期望的结果相比,这太过分了。

  • 最后,您可以使用不同的后端进行解码,例如MediaPlayer+FFMPEG或 just FFMPEG。但同样,即使它有效,我认为这将是一个巨大的矫枉过正。

总而言之,您必须做出妥协才能使其发挥作用。

于 2013-04-05T18:43:03.940 回答