【问题标题】:Android video MediaCodec compression is slowAndroid 视频 MediaCodec 压缩很慢
【发布时间】:2016-10-17 15:15:50
【问题描述】:

我们正在开发一款需要调整大小(帧大小)和压缩视频的 Android 应用。我们测试了下面的代码示例,它目前很慢: https://github.com/hoolrory/AndroidVideoSamples/blob/master/CommonVideoLibrary/src/com/roryhool/commonvideolibrary/VideoResampler.java

输出视频帧大小减小(例如,480x320),并且比特率也降低以实现压缩。最终的视频看起来非常好,压缩比也很好。只是这个过程很慢。我在运行 Android 4.4 的 Galaxy S4 和运行 Android 6.0 的 Galaxy Note 5 上进行了测试。后者更快,但不是很多。在 Galaxy S4 上,一个 30 秒的视频需要大约一分钟来压缩(平均)。

上面的代码解码输入表面上的输入视频,减小帧大小,然后输出到输出表面。 MediaMuxer 用于复用音频。该示例使用 MPEG 容器和 H264 编码器。一些相关问题:

  1. 我们可以使用一些参数来加快压缩速度吗?
  2. 视频压缩速度如何受目标比特率和帧大小(如果有)的影响?
  3. 我们没有使用 FFMpeg。这样更快吗?

任何指针或提示,即使与上面的代码示例无关,也将不胜感激。

非常感谢!

奥马尔

【问题讨论】:

  • 感谢@mstorsjo,我将代码示例中的 TIMEOUT_USEC 设置为 1000 微秒,而不是默认的 10000。在 Galaxy S4 上,十几个不同视频的平均速度提高了 55%长度。对于 Galaxy Note5,速度提升了 65%。

标签: android performance video compression android-mediacodec


【解决方案1】:

您的问题在于您如何同步等待某个组件(编码器或解码器)上的事件。要么重建代码以使用异步回调运行,要么降低超时。

请参阅https://stackoverflow.com/a/37513916/3115956 以获得更多参考资料的详细说明,以及有关如何有效使用异步模式的示例https://github.com/mstorsjo/android-decodeencodetest

【讨论】:

  • 非常感谢@mstorsjo。我将测试您建议的更改并更新回来。
  • 请教一个问题,您指出的代码示例是否假定Android 5.0?我们目前正在尝试支持 API 级别 18+。再次感谢你。 github.com/mstorsjo/android-decodeencodetest
  • 该示例代码需要 Android 5.0,是的。如果您需要支持旧的同步 API,您需要降低超时和/或改进选择如何/何时等待什么超时的逻辑。理想情况下,如果您将超时减少到接近于零,它可能会运行得更快,但是您会浪费更多的时间进行忙碌循环,一直轮询输入/输出。一种可能的解决方案是使用单独的线程,一个向解码器提供输入,一个等待解码器的输出,将其提供给编码器,一个等待编码器的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多