如何以YUV格式与位v交换u



我想以yuv格式交换u和v位,来自nv12

YYYYYYYY UVUV // each letter presents a bit

到NV21

YYYYYYYY VUVU

我独自离开y平面,并通过下面的功能处理u和v平面

uchar swap(uchar in) {
    uchar out = ((in >> 1) & 0x55) | ((in << 1) & 0xaa);
    return out;
}

但我无法获得所需的结果,输出图像的颜色仍然不正确。

如何正确交换U和V平面?

找到了问题。紫外应以字节格式操纵,而不是位。

    byte[] yuv = // ...
    final int length = yuv.length;
    for (int i1 = 0; i1 < length; i1 += 2) {
        if (i1 >= width * height) {
            byte tmp = yuv[i1];
            yuv[i1] = yuv[i1+1];
            yuv[i1+1] = tmp;
        }
    }

尝试此方法(-_-)

    IFrameCallback iFrameCallback = new IFrameCallback() {
    @Override
    public void onFrame(ByteBuffer frame) {
        //get nv12 data
        byte[] b = new byte[frame.remaining()];
        frame.get(b);
        //nv12 data to nv21
        NV12ToNV21(b, 1280, 720);
        //send NV21 data
        BVPU.InputVideoData(nv21, nv21.length,
                System.currentTimeMillis() * 1000, 1280, 720);
    }
};
byte[] nv21;
private void NV12ToNV21(byte[] data, int width, int height) {
    nv21 = new byte[data.length];
    int framesize = width * height;
    int i = 0, j = 0;
    System.arraycopy(data, 0, nv21, 0, framesize);
    for (i = 0; i < framesize; i++) {
        nv21[i] = data[i];
    }
    for (j = 0; j < framesize / 2; j += 2) {
        nv21[framesize + j - 1] = data[j + framesize];
    }
    for (j = 0; j < framesize / 2; j += 2) {
        nv21[framesize + j] = data[j + framesize - 1];
    }
}

最新更新