转换是必要的,一般显卡直接支持的yuv显示格式是I420或者YV12,还是要转
转换方法:1. ffmpeg里的swscale库,1080P的一张视频转换消耗时间在1-5毫秒左右,不能算很耗时
          2. opengl 或者 d3d,自己写着色器转换(相当于显卡实现转换,不怎么用你的cpu)
          
显示写的不好可能比颜色空间转换要的代价更大

解决方案 »

  1.   

    多谢2楼楼主答疑。一直没找到直接显示YUY2的方法。我是用的StretchDIBits函数显示的,转换是根据编码原理转的,CPU占用12%,物理内存18%。那还有没有其他效率高的显示方法?
      

  2.   

    我一般就用ffmpeg里的swscale(主要是用了mmx或者sse指令)转换成BGRA,然后用BitBlt显示(和StretchDIBits是差不多的),没发现效率很低。然后碰到YV12或者I420的可以选择性的用D3D显示(以前是DDraw)。用D3D把转换的事也做了,可以达到很高的效率(这个其实还是比较麻烦的,需要学习使用D3D),openGL可以做同样的事情
      

  3.   

    unsigned char clip255(long v)
    {
    if(v < 0)
    v=0;
    else if( v > 255) 
    v=255;
    return (unsigned char)v;

    BOOL YUY2_RGB2_ljh(unsigned char *YUY2buff,unsigned char  *RGBbuff,long dwSize)
    {
    unsigned char *orgRGBbuff = RGBbuff;
    for( long count = 0; count < dwSize; count += 4 )
    {//Y0 U0 Y1 V0
    unsigned char Y0 = *YUY2buff;
    unsigned char U = *(++YUY2buff);
    unsigned char Y1 = *(++YUY2buff);
    unsigned char V = *(++YUY2buff);
    ++YUY2buff;
    long Y,C,D,E;
    unsigned char R,G,B;
    Y = Y0;
    C = Y - 16;
    D = U - 128;
    E = V - 128;
    R = clip255(( 298 * C           + 409 * E + 128) >> 8);
    G = clip255(( 298 * C - 100 * D - 208 * E + 128)>> 8);
    B = clip255(( 298 * C + 516 * D           + 128) >> 8);
    *(RGBbuff)   = B;
    *(++RGBbuff) = G;
    *(++RGBbuff) = R;
    Y = Y1;
    C = Y-16;
    D = U-128;
    E = V-128;
    R = clip255(( 298 * C           + 409 * E + 128) >> 8);
    G = clip255(( 298 * C - 100 * D - 208 * E + 128)>> 8);
    B = clip255(( 298 * C + 516 * D           + 128) >> 8);
    *(++RGBbuff) = B;
    *(++RGBbuff) = G;
    *(++RGBbuff) = R;
    ++RGBbuff;
    }
    return true;
    }嗯,谢谢。这是我在网上找到的YUY2转RGB的方法,还好用。贴出来,如果有需要可以参考下。
      

  4.   

    嗯,谢谢,我试着用用看。做直播用的,效率和CPU的使用率都得考虑。如果有问题烦请指教小妹。
      

  5.   

    楼主我最近在做类似视频聊天的程序 摄像头采集上来的也是yuy2格式 用DRAWDIBDRAW显示的话是可以正常显示图像的 但是转成rgb24之后显示就有问题了 ……
      

  6.   

    具体出现了什么问题呢?你是用的DRAWDIBDRAW直接显示的yuy2吗?还有你看看函数中有没有有关窗口句柄的参数,有的话把窗口句柄闯过去。我没用过DRAWDIBDRAW显示
      

  7.   

    具体出现了什么问题呢?你是用的DRAWDIBDRAW直接显示的yuy2吗?还有你看看函数中有没有有关窗口句柄的参数,有的话把窗口句柄闯过去。我没用过DRAWDIBDRAW显示嗯 代码里面直接显示的yuy2 
    左边是本地的图像显示 正常的 右边为解码之后的 就有问题了
      

  8.   

    想问下,你是怎么用DRAWDIBDRAW显示YUY2的数据的?
      

  9.   

    http://download.csdn.net/detail/RobertBaker/2801402