最近在搞Android方面的视频处理开发,解码出来的都是YUV420格式的数据,如何在surface上高效显示出来,颇费了一点周折,现在总结一下。
思路1:在java中将Surface指针传递到jni层,lock之后就可以获得SurfaceInfo,进而取得要显示的surface格式、高度、宽度,在2.2/2.3版本,surface的Format一般都是RGB565格式,只用做一个颜色空间的转换,scaler就可以将yuv数据显示出来。
颜色空间转换和Scaler算是比较耗时的操作了。如何提高效率,scaler最好能交给android的底层函数去做,如果有gpu的,底层函数直接会利用gpu,效率非常高,又不占用cpu资源。
思路2:
   参考framework中的AwesomePlayer,里面利用AwesomeLocalRenderer/AwesomeRemoteRenderer来实现解码出来的数据显示,这个效率应该非常高,但是平台的关联性会增加很多。
   调用接口比较简单,
   首先创建一个render,
               mVideoRenderer = new AwesomeRemoteRenderer(
                mClient.interface()->createRenderer(
                        mISurface, component,
                        (OMX_COLOR_FORMATTYPE)format,
                        decodedWidth, decodedHeight,
                        mVideoWidth, mVideoHeight,
                        rotationDegrees));
  直接调用render函数就可以显示了。
    virtual void render(MediaBuffer *buffer) {
        void *id;
        if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
            mTarget->render((IOMX::buffer_id)id);
        }
    }
   
   其它的参数都很容易获得,关键是buffer_id 怎么获得?OMXCodec.cpp中有相关的可以参考。
   实际的效果在我的S510E上跑,效率非常高,几乎不占用主控cpu资源,很可能都交给dsp和gpu去搞了。  
   
思路3:
  参考 camera的方式。由于在第2步已经取得了非常好的效果,笔者没有做深入研究。
- 相关文章
 - Android JNI调用C计算代码执行时间(秒) (91人浏览)
 - Android NDK开发中解决 UINT64_C was not declar (179人浏览)
 - android ndk抛出 signal 11 (SIGSEGV), code (327人浏览)
 - Android NDK调用时Java 的类型与虚拟机中的表示对照表 (62人浏览)
 - Android Application对象必须掌握的七点 (45人浏览)
 - 不同Android版本之间旋转屏幕时禁止重新加载Activity的区别 (387人浏览)
 - 手把手教你轻松解决Android模拟器无法上网的问题 (438人浏览)
 
- 1楼 飞刀 发表于 2014-5-21 11:10:56
 - 能不能把完整代码贴出来,就这个片段,好像没法参考哦
 






