public class DecodeYUV420sp {
static public void decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {
final int frameSize = width * height; for (int j = 0, yp = 0; j < height; j++) {
int uvp = frameSize + (j >> 1) * width, u = 0, v = 0;
for (int i = 0; i < width; i++, yp++) {
int y = (0xff & ((int) yuv420sp[yp])) - 16;
if (y < 0)
y = 0;
if ((i & 1) == 0) {
v = (0xff & yuv420sp[uvp++]) - 128;
u = (0xff & yuv420sp[uvp++]) - 128;
} int y1192 = 1192 * y;
int r = (y1192 + 1634 * v);
int g = (y1192 - 833 * v - 400 * u);
int b = (y1192 + 2066 * u); if (r < 0)
r = 0;
else if (r > 262143)
r = 262143;
if (g < 0)
g = 0;
else if (g > 262143)
g = 262143;
if (b < 0)
b = 0;
else if (b > 262143)
b = 262143; rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00)
| ((b >> 10) & 0xff);
}
}
}
}
自己解决了- - 写了一个类

解决方案 »

  1.   

    这样子解码性能会比较成问题,如果是从camera获取的preview,可能会卡死。
    可以考虑用JNI解码,或者用YuvImage应该也可以
      

  2.   

    2楼正解,jni不会写的话,直接用YuvImage,谷歌帮你解决了
      

  3.   

    调用C++外库去操作么- -对了  
    RGB420转化 RGB 彩色yuv颜色会失真
      

  4.   

    调用C++外库去操作么- -对了  
    RGB420转化 RGB 彩色yuv颜色会失真
    失真应该是可以忽略不计的。Yuv转RGB的算法有很多,自己搜一下吧
      

  5.   

    调用C++外库去操作么- -对了  
    RGB420转化 RGB 彩色yuv颜色会失真
    失真应该是可以忽略不计的。Yuv转RGB的算法有很多,自己搜一下吧YUV转RGB 看看算法就那么几种  都会失真 颜色
      

  6.   

    以前用这个写过实时滤镜,简直苦不堪言,YUV转化为RGB直接用bitmap显示,速度还可以,但帧数已经低于预览的帧数了,如果要加上一些自己的处理的话,建议楼主另寻他法,比如opengl
      

  7.   

    - - YUV数据 直接通过bitmap 显示 死命的失真 对么- - 
      

  8.   

    昨天试用了一下  YUVImage 颜色还是不对劲
      

  9.   

    没有遇到过失真的问题,我当时没有失真的问题,是帧数过低也就是处理过慢的问题。
    你的问题我觉得可能是算法导致的,你先不要用优化的YUV转RGB算法试试,就是直接用浮点运算的那个算法,百度应该有。
      

  10.   

    彩色的 yuv 文件  黑白图就没事情 我感觉算法有问题!!!
      

  11.   

    你这个不是失真,是写错了。
    YUV有很多格式,比如你的YUV是yuv420p的,如果用yuv420sp的转码方式,就会这样
      

  12.   

    算法太多 - - 不对劲 
    420sp 420p - -如何分辨
      

  13.   


    IYUV 格式 会显示正确
      

  14.   

    YUV格式应该是这样的
    YYY.................
    UUU..............
    VVV.................
      

  15.   

    rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00)
    | ((b >> 10) & 0xff);
    把 rgb[yp] 改成rgb[i*height+height-1-j] 试试
      

  16.   

    那就是类型的问题了吧,因为我之前写的demo里的这个函数跟楼主是一样的,楼主应该也是从网上找的这一段,你的数据源从哪里来?
      

  17.   


    数据源- - 别人给 - -
    http://url.cn/QEcixm
    数据源这个yuv 文件
      

  18.   

    Opengl 目前还在研究- - 没接触过 所以不怎么会
      

  19.   

    如果你一定要把这张yuv格式的显示为bitmap的话,你可以试试其他yuv格式比如也很常用的yuv411的算法,但不知道意义在哪里因为yuv420是camera预览的默认格式,所以楼主你用的这个函数也有人会想要去实现并且已经在网上流传了,但yuv411怕是要你自己写了,理解下格式修改一下函数吧~
      

  20.   

    不用这个0 0 用什么 求指教 opengl 有点难度 貌似
      

  21.   

    不用这个0 0 用什么 求指教 opengl 有点难度 貌似 
    我是说可以把YUV420的算法改成YUV411的 你百度一下YUV的各种格式
      

  22.   

    不用这个0 0 用什么 求指教 opengl 有点难度 貌似 
    我是说可以把YUV420的算法改成YUV411的 你百度一下YUV的各种格式YUV12 格式 貌似是有 符号的读入
      

  23.   

    希望大牛给一个 android opengl 直接画出yuv数据的一个demo