每当我尝试加载至少4个mediaPlayers时,其中一个会破坏正在尝试加载的视频并触发Android操作系统消息“无法播放此视频”
其他信息:
对于3个媒体播放器,一切正常。
在其他Android版本上,与4.2不同,相同的代码与4个视频相同。
4视频可以在设备上独立播放。没有格式问题。
启动程序并获取“无法播放此视频”消息后,除非我重置设备,否则视频将无法再在任何其他应用程序中播放。
我尝试使用VideoViews或SurfaceViews上显示的独立MediaPlayers。
我在运行Android 4.2的更多设备上复制了错误。 在Android 4.1.2和其他Android 4版本上,我不记得代码工作正常。
答案 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
+ FFMPEG
或FFMPEG
。但同样,即使它有效,我认为这将是一个巨大的矫枉过正。
总结一下,你必须妥协才能使其发挥作用。