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

时间:2013-04-05 16:36:51

标签: android media-player android-videoview android-4.2-jelly-bean

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

其他信息:

对于3个媒体播放器,一切正常。

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

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

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

我尝试使用VideoViews或SurfaceViews上显示的独立MediaPlayers。

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

1 个答案:

答案 0 :(得分:1)

在Android上,我们的想法是,与开发人员隐藏与媒体编解码器相关的所有内容,而开发人员必须使用一致且唯一的API:MediaPlayer

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

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

事实上,我所说的内容已在Android开发者网站的documentation of release中说明:

  

释放与此MediaPlayer对象关联的资源。它是   当你完成使用时,我们认为这是一种很好的做法   MediaPlayer。特别是,每当一个应用程序的活动   暂停(调用其onPause()方法)或停止(其onStop()   方法被调用),应该调用此方法来释放   MediaPlayer对象,除非应用程序有特殊需要保留   周围的物体。除了不必要的资源(如   正在保持的内存和编解码器实例,无法调用它   如果不再需要MediaPlayer对象,可以立即使用方法   也导致移动设备的持续电池消耗,以及   如果没有多个实例,则其他应用程序的播放失败   设备支持相同的编解码器。即使是多个实例   支持相同的编解码器,可能会有一些性能下降   当不必要的多个实例同时使用时   时间。

因此,当你完成回放时,你不是在调用release,或者是其他应用程序正在对这种资源进行引用。

编辑:

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

你可以尝试做的事情是:

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

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

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

总结一下,你必须妥协才能使其发挥作用。