【问题标题】:Suggestions for optimizing a video decoder优化视频解码器的建议
【发布时间】:2013-02-11 15:47:33
【问题描述】:

我最近将一个视频解码器(用 C 编写)移植到了 android 平台。它的输出是 YUV 格式。所以我不得不将它转换为 RGB8888 以使用本机代码中的 ANativeWindow API 显示它。虽然移植成功,但在使用 -O2(LOCAL_C_FLAG) 的优化级别后,对于 416x240 的输入,我能够渲染的输出约为 8.5fps。

  • 有没有一种方法可以更快地渲染视频而无需转到 c 和 装配级别的优化?
  • 即使解码速度较慢,有没有办法让它看起来 好像视频跑得更快了?

任何有用的建议将不胜感激。

【问题讨论】:

  • 最有可能加快渲染速度的一件事是使用 OpenGL ES 并在片段着色器中进行 YUV->RGB 转换。

标签: android optimization android-ndk render porting


【解决方案1】:

您可以使用 GLSurfaceView/Renderer 对来进行渲染。

  1. 在您自己的 GLSurfaceView.Renderer 实现中,使用本机方法覆盖 OnDrawFrame。

  2. 在您的原生实现中,使用 OpenGL ES.20 片段着色器进行色彩空间转换(以及缩放)。

通过这种方式,您不必担心视图/位图/UI 同步的细节。而且 OpenGL ES 真的很快。

【讨论】:

  • 感谢您的回复。 +1 为您的努力。但是你认为 yuv->RGB 会降低每秒帧数吗?此外,如果您有任何关于如何在本机代码中使用 Open GL ES.20 的示例,请发布。因为我从来没有使用过它。所以举个例子,我可以尝试一下。请发布一些示例,以便我可以继续。提前致谢。
  • 基于 OpenGL 的 yuv->RGB 对于典型的 720x480 图像应该花费不到 10 毫秒的时间来完成,因此它不会成为瓶颈。对于您获得的 8.5fps,您需要分析以下每个阶段的 CPU 负载:解码、色彩空间转换、位图复制……以找出最薄弱的环节。有关基于 OpenGL 的 YUV-RGB 转换的更多信息,您可以参考this topic。不过,您确实需要具备一些基本的 OpenGL 知识。
  • 嗨,正如你所说,我使用 android-ndk-profiler 对其进行了分析,发现每帧的转换几乎不需要 6.66 毫秒。所以我认为这种技术相当快..
猜你喜欢
  • 1970-01-01
  • 2020-02-14
  • 2012-02-23
  • 2015-01-06
  • 2016-08-20
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多