记录I420转NV21如何自己把自己坑死的

近期遇到的绝大多数问题都不是问题,最大的问题是自己太坑。

码代码码的挺开心,结果后期简化代码差点把自己硬生生坑死,几乎怀疑自己不适合做这行。


先前做的I420转NV21和NV12,为了试验YUV分量是否真的转换成功了使用了如下的数组:

    char exe[] = {10,11,12,13,14,15,16,17,        //y
                          20,21,22,23,24,25,26,27,        //y
                          30,31,32,33,34,35,36,37,        //y
                          40,41,42,43,44,45,46,47,        //y
                          50,51,52,53,54,55,56,57,        //u
                          60,61,62,63,64,65,66,67};        //v

以Y分量的宽width、高height和数组头指针tmp作为已知量(工程中可获取到的)。

初始代码中使用了指针从tmp开始偏移拷贝,优化代码的时候转成了用不同的指针分别指向U、V分量的第一个元素,而后进行偏移拷贝,然后作死地把样例代码中的V指针头偏了一行。。。

样例代码中Y分量height为4,UV分量各占1,的确是偏一行就可以的,但实际情况下一张图片的分量排布并不是UV只间隔一行的,所以要修改。实际上要偏1/4height哈,不然图片输出是有颜色偏差的。

完了上传上去的代码如果我没记错的话貌似NV21和NV12分量排布反掉了。。。我的错。自己传的自己下载还不能评论,时间过了又不能改。但愿不会坑到别人吧。。。

仍需努力啊。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中实现YUV420换为NV21格式,可以使用以下代码: ```java public class Yuv420ToNv21Converter { private byte[] yuv420; private byte[] nv21; private int width; private int height; public Yuv420ToNv21Converter(byte[] yuv420, int width, int height){ this.yuv420 = yuv420; this.width = width; this.height = height; nv21 = new byte[width * height * 3 / 2]; // NV21格式占用的空间大小为width * height * 3 / 2 } public byte[] convert(){ int frameSize = width * height; int chromaSize = frameSize / 4; //将Y数据直接复制到NV21数组中 System.arraycopy(yuv420, 0, nv21, 0, frameSize); //将V、U数据交叉复制到NV21数组中 for (int i = 0; i < chromaSize; i++) { nv21[frameSize + i * 2] = yuv420[frameSize + i + chromaSize]; // 交叉复制V数据 nv21[frameSize + i * 2 + 1] = yuv420[frameSize + i]; // 交叉复制U数据 } return nv21; } } ``` 解析: 1. 创建一个Yuv420ToNv21Converter类,构造函数接收YUV420数据、图像宽度和高度。 2. 定义yuv420和nv21两个byte数组,分别保存输入的YUV420数据和换后的NV21数据。 3. 在构造函数中初始化nv21数组,大小为width * height * 3 / 2,因为NV21格式占用的空间大小为Y数据的大小加上U、V数据的一半大小。 4. convert()方法实现YUV420到NV21换: - 将Y数据直接复制到NV21数组中。 - 将V、U数据交叉复制到NV21数组中,交叉复制时先放置V数据,再放置U数据。 5. 返回换后的nv21数组。 使用以上代码,可以将YUV420数据换为NV21格式,适用于需要处理视频或图像数据的Java应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值