【问题标题】:Android: playing many video simultaneouslyAndroid:同时播放多个视频
【发布时间】:2015-01-19 07:41:32
【问题描述】:

我正在开发一个聊天工具,我们有高质量的表情符号,扩展名为 mp4(文件大小约为 300kb)。 GIF 格式由于质量差且颜色有限 (256) 而未被使用。
我需要将 ListView 中的文件显示为循环视频。 现在我正在尝试使用 TextureView 和 MediaCodec 类来做到这一点。 可以在https://github.com/google/grafika 找到来源。
问题是当您尝试同时播放 4 个以上的视频时,会发生错误 android.media.MediaCodec.dequeueOutputBuffer 处的 IllegalStateException。 我认为这是因为内存消耗大, 在我的设备(HTC ONE M7)上播放四个视频时,处理器负载超过 60%!
我该如何解决这个问题?也许我需要使用第三方编解码器?
或者使用视频显示笑脸的想法很糟糕,我需要放弃它并使用 GIF 之类的东西?

【问题讨论】:

  • 你不能在 android 的一个线程中启动一个线程。您必须为它创建一个单独的线程任务并让 android 的工作线程处理它们,然后它们反过来将信息反馈给您的 UI 线程。 Asynctask 非常适合加载小视频,但对于长期应用程序,您将需要一个 Service。
  • 嗯,据我所知只有 4 个 kworkers,我猜他们已经用 4 个视频刷爆了。
  • 所有视频已经在不同的线程中播放。
  • 视视频质量而定,可以同时播放8个质量差的视频...
  • 我相信这是平台限制,你不能创建太多解码器的实例如果你需要更多,你必须选择另一种方式

标签: android video gif android-mediacodec textureview


【解决方案1】:

同时解码器的数量是有限制的,如果没有其他原因,您会超过硬件的最大带宽。在某些设备上,我看到它在配置两个硬件解码器后切换到软件解码。 AFAIK 这里没有强制行为。

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

更新:根据this link,'M' 版本计划添加MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances(),它提供“支持的最大并发编解码器实例数的提示”。对您的问题没有真正的帮助,但至少它会给您一个数字。希望 API 会考虑视频分辨率。

【讨论】:

  • 谢谢各位大佬,还是用GIF比较靠谱的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多