Android视频录制之NV21和NV12

tech2023-01-17  255

从Camera.PreviewCallback接口回调方法onPreviewFrame(byte[] data, Camera camera)回调的data数据,为NV21图像数据,而Android手机识别的是NV12图像数据,所以需要将NV21转化为NV12图像数据。NV21图像数据包括三块区域数据,分别为Y、V、U三块,一个XY像素的图片,他的NV21数据大小为 **byte[XY3/2]**,其中byte[XY]为Y区域,剩下的1/2U和V区域各占1/4;“Y”表示明亮度,“U”和“V”则是色度、浓度。 可以发现NV21和NV12数据唯一的区别就是V、U区域的不同,而Y区域数据是相同的。其实data数据只是一个一维数组,但是为了更好理解所以排列成这样。所以NV21->NV12的数据变化其实就是矩阵数据的变化。以下各图分别表示NV12数据的旋转(仅提供90度和270度变化)和镜像变化。 经过NV12的镜像变化可以为上图所示的数据展示,NV12的镜像变化是分区域的,不是矩阵完全镜像变化,是按照Y,VU区域两个区域分别变化的,而VU是作为一个整体。其实如果你仔细点你会发现NV12的镜像矩阵是NV21的完全镜像矩阵,所以如果你真的要自己完成矩阵的这两步变化,可以直接将NV21进行完全矩阵变化,两步合成一步,可以节省一部分的时间。 其实矩阵的变化,我自己已经完成了,但是最终的视频有一定的问题,就是视频中有的帧会出现纵向的分割线,所以自己的方法搁置了,采用了libyuv框架完成的。libyuv才用的是将NV21变成I420,然后通过对I420进行变化,然后将I420变成NV12数据。所以你是打算自己写NV21的数据变化吗?希望这些可以帮助到你。

最新回复(0)