Android 4.2 with 4 MediaPlayers ="无法播放此视频"

Ste*_*dru 7 android media-player android-4.2-jelly-bean android-videoview

每当我尝试加载至少4个mediaPlayers时,其中一个会损坏正在尝试加载的视频并触发Android操作系统消息"无法播放此视频"

其他信息:

对于3个mediaPlayers一切正常.

在其他Android版本上,与4.2不同,相同的代码与4个视频相同.

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

启动程序并获取"无法播放此视频"消息后,除非重置设备,否则视频将无法再在任何其他应用程序中播放.

我尝试使用VideoViews或surfaceViews上显示的独立MediaPlayers.

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

Hal*_*oum 1

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

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

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

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

释放与此 MediaPlayer 对象关联的资源。使用完 MediaPlayer 后调用此方法被认为是一个很好的做法。特别是,每当应用程序的 Activity 暂停(调用其 onPause() 方法)或停止(调用其 onStop() 方法)时,都应调用此方法来释放 MediaPlayer 对象,除非应用程序有特殊的需要将物体保留在周围。除了占用不必要的资源(例如内存和编解码器实例)之外,如果不再需要 MediaPlayer 对象而无法立即调用此方法,还可能导致移动设备持续消耗电池,并且如果不调用该方法,其他应用程序将无法播放。设备支持同一编解码器的多个实例。即使支持同一编解码器的多个实例,当同时使用不必要的多个实例时,也可能会出现一些性能下降。

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

编辑 :

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

你可以尝试做的是:

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

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

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

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