2013-02-26 104 views
0

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

  • 有没有办法呈现视频更快而不去c和 汇编级别的优化?
  • 尽管解码速度较慢,但​​有没有办法让它看起来像是视频运行得更快? ?

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

+0

最有可能加速渲染的一件事就是使用OpenGL ES并在片段着色器中执行YUV-> RGB转换。 – Michael 2013-02-26 10:52:02

回答

1

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

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

  2. 在本地实现中,使用OpenGL ES.20碎片着色器来执行色彩空间转换(以及缩放)。

您不必担心这种方式的视图/位图/ UI同步的细节。而且OpenGL ES非常快。

+0

感谢您的回复。为你的努力+1。但是你认为yuv-> RGB正在减慢每秒帧数?此外,如果您有任何有关如何在本机代码中使用Open GL ES.20的示例,请将其发布。因为我从来没有与它合作过。所以举个例子,我可以尝试一些事情。请张贴一些例子,以便我可以继续。提前致谢。 – Zax 2013-02-27 04:22:11

+1

基于OpenGL的yuv-> RGB应该少于10ms才能完成典型的720x480图像,因此它不会成为瓶颈。对于8.5fps,您需要为每个后续阶段分析CPU负载:解码,色彩空间转换,位图复制...以找出哪一个是最薄弱的环节。 有关基于OpenGL的YUV-RGB转换的更多信息,请参阅[本主题](http://stackoverflow.com/questions/12130790/yuv-to-rgb-convertion-by-fragment-shader)。但是,您确实需要拥有一些基本的OpenGL知识。 – Joey 2013-02-27 05:47:45

+0

嗨,你说我使用android-ndk-profiler进行了描述,发现每帧的转换几乎不需要6.66ms。所以我认为这种技术相当快 – Zax 2013-02-27 06:23:58