NV21与I420
Android Camera对象通过setPreviewCallback 函数,在onPreviewFrame(byte[] data,Camera camera)中回调采集的数据就是NV21格式。而x264编码的输入数据却为I420格式。
因此,当我们采集到摄像头数据之后需要将NV21转为I420。
NV21和I420都是属于YUV420格式。而NV21是一种two-plane模式,即Y和UV分为两个Plane(平面),但是UV(CbCr)交错存储,2个平面,而不是分为三个。这种排列方式被称之为YUV420SP,而I420则称之为YUV420P。(Y:明亮度、灰度,UV:色度、饱和度)
下图是大小为4x4的NV21数据:Y1、Y2、Y5、Y6共用V1与U1,…

而I420则是

可以看出无论是哪种排列方式,YUV420的数据量都为: w*h+w/2*h/2+w/2*h/2 即为w*h*3/2
将NV21转位I420则为:
Y数据按顺序完整复制,U数据则是从整个Y数据之后加一个字节再每隔一个字节取一次。
手机摄像头的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向坐标原点于手机横放时的左上角。当应用是横屏时候:图像传感器方向与屏幕自然方向原点一致。而当手机为竖屏时:

Android相机回调的NV21格式数据需要转换为I420进行x264编码。NV21是YUV420SP,I420是YUV420P,两者Y数据相同,但UV数据处理不同。在手机横竖屏切换时,摄像头数据需相应旋转。Camera API允许设置预览角度,但在onPreviewFrame中仍需手动旋转NV21数据。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



