添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
心软的小虾米  ·  Flutter ...·  2 周前    · 
爱搭讪的麻辣香锅  ·  android ...·  1 年前    · 
逃跑的小刀  ·  cef html5 ...·  1 年前    · 
腼腆的蚂蚁  ·  DECLARE is not valid ...·  1 年前    · 
绅士的打火机  ·  latex图文混排 - 简书·  1 年前    · 
首发于 flutter

YUV420和NV21

Flutter Camera在 Android 中对象通过_controller!.startImageStream(onProcessFrame) 函数,在onProcessFrame(CameraImage cameraImage)中回调采集的数据就是YUV420格式,最新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,......

NV21



而I420则是

I420





可以看出无论是哪种排列方式,YUV420的数据量都为: w h+w*h/4 + w*h/4 即为w h*3/2

常用I420中,YUV详解: Y占w* h,U占w*h/4,V占w*h/4

Y区域就是src[0]

U区域偏移位置是src[w*h]

V区域偏移位置是src[w *h *5/4 ]


将NV21转位I420则为:
Y数据按顺序完整复制,U数据则是从整个Y数据之后加一个字节再每隔一个字节取一次。

#安卓手机摄像
手机摄像头的图像数据来源于摄像头硬件的图像传感器,这个图像传感器被固定到手机上后会有一个默认的取景方向,这个取景方向坐标原点于手机横放时的左上角。当应用是横屏时候:图像传感器方向与屏幕自然方向原点一致。而当手机为竖屏时:



传感器与屏幕自然方向不一致,将图像传感器的坐标系逆时针旋转90度,才能显示到屏幕的坐标系上。所以看到的画面是逆时针旋转了90度的,因此我们需要将图像顺时针旋转90度才能看到正常的画面。而Flutter的Camera对象提供一个lockCaptureOrientation接口能够设置预览显示的角度:

 _controller!.lockCaptureOrientation(DeviceOrientation.landscapeRight);





根据文档,配置完Camera之后预览确实正常了,但是在onProcessFrame中回调获得的数据依然是逆时针旋转了90度的。所以如果需要使用预览回调的数据,还需要对onProcessFrame回调的字节流byte[] 进行旋转。

下面有NV21格式举例:
旋转前:

nv21旋转前





后置摄像头需要顺时针旋转90度,旋转后:

nv21顺时针旋转90度




前置摄像头需要逆时针旋转90度,旋转后:


nv21逆时针旋转90度




前置摄像头可能还需要进一步镜像处理,镜像后:


nv21逆时针旋转90度&镜像

编辑于 2023-08-05 00:15 ・IP 属地云南

文章被以下专栏收录