本帖最后由 wujxiaoz 于 2012-07-02 21:27:11 编辑

解决方案 »

  1.   

    请参考opencore和STAFEFright中输出视频的相关代码 
    opencore中的MediaoutputNOde就知道怎么作了
    源文档 <http://topic.csdn.net/u/20110113/12/2c143c1a-4930-4f8a-a6fd-9c5c3c19cabf.html> 好象surface在Android2.0以后,只支持RGB565了,之前是支持YUV420的。
    但即使这样,Android2.2中,在surfaceflinger层,是支持YUV420的,camera输出大都是YUV啊。
    源文档 <http://www.eoeandroid.com/thread-52488-1-1.html> 
      

  2.   

    如何在Android上快速显示yuv数据
    http://blog.csdn.net/xdljf/article/details/7178620AwesomePlayer 源代码分析
    http://blog.csdn.net/shcalm/article/details/6925591AwesomePlayer的启动工作
    http://hi.baidu.com/wind_liao/item/260a8c091d7b7f304ac4a352
      

  3.   

    YUV420SP就是NV12格式,Y分量平面格式,UV打包格式。(Y数据全部从在一块,UV数据使用交错方式存储)
    YUV420P,Y,U,V三个分量都是平面格式。
    http://topic.csdn.net/u/20101202/13/b68be997-fd54-4ada-a5c0-fc66c9783b6b.htmlByteArrayOutputStream out = new ByteArrayOutputStream(); 
    YuvImage yuvImage = new YuvImage(data, PictureFormat.NV21, width, height, null); 
    yuvImage.compressToJpeg(new Rect(0, 0, width, height), 50, out); 
    byte[] imageBytes = out.toByteArray(); 
    Bitmap image = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length); 
    iv.setImageBitmap(image); 
    http://stackoverflow.com/questions/9192982/displaying-yuv-image-in-androidThe assumption is that most smartphone chipsets have color conversion, 
    rotation, and scaling in hardware. The pixel format enumerations are 
    there to support some typical formats that we expect to see used by 
    hardware. The software renderer (SurfaceFlinger/PixelFlinger) only supports RGB565. 
    http://groups.google.com/group/android-framework/browse_thread/thread/d3f242356375effa/367d64dcaa3cdaf3?其实android里面定义的有overlay的接口,如果你的硬件支持的话,应该可以直接调用显示。
    但是好像没有开放overlay的借口给java层,所以你应该只能在framework层调用overlay来显示你的解码后的图像。
    具体的例子,你可以参考一下camera 的实现,做pre-view的时候就是调用的overlay直接显示的。我的是使用ti的omap4430,我直接调用libstagefrighthw.so库来显示,在root下用二进制代码测试,VideoRenderer对象能创建,但是在render的时候,如果是720p,就只能render 1280长度的yuv数据,调用render传入实际长度的数据程序则崩溃。还有我直接使用overlay驱动,但是overlay_handle_t  mOverlayHandle = (overlay_handle_t)overlay->getHandleRef(overlay);程序调用到这步就挂了。
    第一个方案:是直接参考android源代码中的awesomplayer.cpp调用过程来的。
    第二个方案:其实就是第一个方案的底层调用。
    http://www.eoeandroid.com/thread-31939-1-1.htmlopen core的代码似乎会自动调用overlay,如果你的系统里有libopencorehw.so这个库的话。你可以在opencore代码里搜索一下这个库的名字,能看到相关的逻辑。
    http://www.eoeandroid.com/thread-4510-1-1.htmlYuvImage                                          Since: API Level 8 
    YuvImage(byte[] yuv, int format, int width, int height, int[] strides) 
    http://developer.android.com/reference/android/graphics/YuvImage.html
      

  4.   

    楼主掌握的很多了,overlay显示的就是yuv数据吧
      

  5.   

    ameyume你有什么相关的demo或资料没?
      

  6.   

    请问,楼主这个问题解决了没?我最近也在研究这方面的资料。
    我的思路是 将android源码下载下来,提取出statefright中有关视频显示的部分,进而编译成.so文件,已供jni调用来显示FFMPEG解码后的YUV数据,不知道这个思路对不对。不过目前进展很不顺利,下载太麻烦,编译也烦,估计提取更不好弄,不知道你那有没有什么好的方法。谢谢!!!
      

  7.   

    楼上思路应该是正确的,提取AwesomeLocalRenderer
      

  8.   

    现在有个neon优化过的YUV转RGB的代码,效率貌似不错,知道跟上述方式比效率上要差多少。
      

  9.   

    您好 我最近也在设法安卓上yuv数据不转化直接显示,根据网络上资料使用surface 显示yuv  参照了这位哥们的代码:http://www.aichengxu.com/view/30134
    这其中jni层要链接到Android到源码里面的一些文件,用cygwin编译jnI库没问题,但是运行apk加载so库的时候就会报错,猜测可能也需要编译安卓源码,在安卓源码环境下编译,可是这个工作量很大,也很耗费时间,目前已下载过多个版本的Android源码,编译都没有通过,各种错误,因为本身是做c的,所以也没什么人可以求教。
    所以想向您咨询一下 您最后有没有解决这个yuv显示的呢,我的思路 surfaceview显示yuv是不是正确,安卓源码环境下编译是否可行,不知道您是不是有更好的方法解决了这个yuv显示 
    谢谢