【问题标题】:How to swap bit U with bit V in YUV format如何在 YUV 格式中将位 U 与位 V 交换
【发布时间】:2016-06-21 11:40:57
【问题描述】:

我想从 NV12 交换 YUV 格式的 U 和 V 位

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 平面?

【问题讨论】:

  • 您确定每个色度通道只有两个位吗?
  • NV21 通常意味着每 4 个字节的亮度有 1 个字节的 U 和 1 个字节的 V,这意味着您要交换每个 字节,而不是位。
  • 你说得对,我需要交换字节,而不是比特。

标签: image-processing yuv fourcc


【解决方案1】:

发现问题。 UV 应该以字节格式操作,而不是位。

    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;
        }
    }

【讨论】:

    【解决方案2】:

    试试这个方法(-_-)

        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];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-14
      • 2015-07-03
      • 2015-07-25
      • 2014-11-06
      • 2011-08-23
      • 1970-01-01
      • 2010-09-13
      • 2016-04-06
      相关资源
      最近更新 更多