在 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
。但同样,即使它有效,我认为这将是一个巨大的矫枉过正。
总而言之,您必须做出妥协才能使其发挥作用。