首页 新闻 会员 周边

Android Camera提取出来的yuv420源数据怎么提取y、u、v分量啊~~~

0
悬赏园豆:10 [已关闭问题] 关闭于 2013-10-11 11:24

我想将Android Camera采集的yuv420数据源直接纹理贴图,可是不知道怎么提取y、u、v分量。求大牛帮助~~

问题补充:
Android camera采集到的可以是yuv420sp也可以食yuv420p。我知道yuv420中yuv的分布。现在主要有个前提是从Android Camera 中采集到的yuv420数据,这个byte[]的长度是一倍的视频宽高乘积,不是1.5倍。在jni里面获取到的长度又确实是1.5倍,但是在jni里面转换为jbyte* 的长度还是1倍,就不知道怎么弄了~
胖胖小猪的主页 胖胖小猪 | 菜鸟二级 | 园豆:204
提问于:2013-10-10 13:41
< >
分享
所有回答(1)
0

Camera默认的预览格式是 NV21,4:2:0 结构的,每个U、V用于4个Y
参考下下面的代码
**
* Converts YUV420 NV21 to ARGB8888

* @param data byte array on YUV420 NV21 format.
* @param width pixels width
* @param height pixels height
* @retur a ARGB8888 pixels int array. Where each int is a pixels ARGB. 
*/
public static int[] convertYUV420_NV21toARGB8888(byte [] data, int width, int height) {
    int size = width*height;
    int offset = size;
    int[] pixels = new int[size];
    int u, v, y1, y2, y3, y4;
  
    // i along Y and the final pixels
    // k along pixels U and V
    for(int i=0, k=0; i < size; i+=2, k+=1) {
        y1 = data[i  ]&0xff;
        y2 = data[i+1]&0xff;
        y3 = data[width+i  ]&0xff;
        y4 = data[width+i+1]&0xff;
  
        v = data[offset+k  ]&0xff;
        u = data[offset+k+1]&0xff;
        v = v-128;
        u = u-128;
  
        pixels[i  ] = convertYUVtoARGB(y1, u, v);
        pixels[i+1] = convertYUVtoARGB(y2, u, v);
        pixels[width+i  ] = convertYUVtoARGB(y3, u, v);
        pixels[width+i+1] = convertYUVtoARGB(y4, u, v);
  
        if (i!=0 && (i+2)%width==0)
            i+=width;
    }
  
    return pixels;
}
  
private static int convertYUVtoARGB(int y, int u, int v) {
    int r,g,b;
  
    r = y + (int)(1.402f*u);
    g = y - (int)(0.344f*v + 0.714f*u);
    b = y + (int)(1.772f*v);
    r = r>255? 255 : r<0 ? 0 : r;
    g = g>255? 255 : g<0 ? 0 : g;
    b = b>255? 255 : b<0 ? 0 : b;
    return 0xff000000 | (r<<16) | (g<<8) | b;
}

胖胖小猪 | 园豆:204 (菜鸟二级) | 2013-10-11 11:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册