安卓:同时播放多个视频

4
我正在开发一款聊天应用,我们拥有扩展名为mp4的高质量表情(文件大小约为300kb),因为GIF格式画质较差且颜色受限(256),所以不能使用。我需要将文件在ListView中显示为循环视频。目前,我正在尝试使用TextureView和MediaCodec类来实现这一点。可以在https://github.com/google/grafika找到源代码。问题是,当我尝试同时播放超过4个视频时,会出现IllegalStateException异常,异常位置在android.media.MediaCodec.dequeueOutputBuffer处。我认为这是由于大量的内存消耗导致的,在我的设备(HTC ONE M7)上播放四个视频时,处理器负载超过60%! 我该怎么解决这个问题?也许我需要使用第三方编解码器?或者使用视频来显示表情的想法不好,我需要放弃并使用像GIF这样的东西吗?

在Android中,您不能在线程内启动另一个线程。您必须为其创建单独的线程任务,并让Android的工作线程处理它们,然后再将信息反馈给您的UI线程。Asynctask适用于加载小视频,但对于长期应用程序,您需要使用Service。 - G_V
据我所知,只有4个kworker,我猜他们已经用4个视频达到了最大值。 - G_V
所有视频已经在不同的线程中播放。 - Dmitriy Puchkov
这取决于视频的质量,如果质量不好,可以同时播放8个视频... - Dmitriy Puchkov
我相信这是平台的限制,你不能创建太多的解码器实例。如果你需要更多,你必须选择另一种方式。 - Marlon
1个回答

1

同时解码器存在数量限制,这是由硬件的最大带宽决定的。某些设备在配置了两个硬件解码器后会切换到软件解码器。据我所知,在此方面没有强制行为。

您的问题可能有一个解决方案,那就是使用单个复用视频,在一个.mp4文件中包含所有表情符号。将其播放到SurfaceTexture中,然后将其用作“sprite sheet”。此方法要求所有动画具有大致相同的帧数,因此您可能需要调整一些动画或仅填充序列。

更新:根据this link,‘M’版本计划添加MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances(),该方法提供了“支持的并发编解码器实例的最大数量的提示”。虽然无法真正解决您的问题,但至少它会给出一个数字。希望API能够考虑视频分辨率。


谢谢,我仍然相信老板们使用GIF更好。 - Dmitriy Puchkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接