1、编译v4l2回环设备驱动camera驱动,生成video0设备;
drivers/v4l2loopback/v4l2loopback.c
drivers/v4l2loopback/v4l2loopback_formats.h
drivers/v4l2loopback/v4l2loopback.h
drivers/v4l2loopback/Makefile
2、使用yuv420_infiniteloop.c编译出来的应用程序(这里可以放到安卓的代码下mmm编译)实现数据写入video0设备中,这里写入的数据格式是YUV格式的数据。
操作指令如下
yuv420_infiniteloop /dev/video0 /data/caigong1.yuv 640 480 30
注意修改代码中的数据格式:v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; //也可以修改为V4L2_PIX_FMT_YUYV
caigong1.yuv文件是由caigong.mp4转换而来的yuv文件,使用ffmpeg可以实现转换:
2.1、linux环境下将 mp4 文件转 yuv 文件
ffmpeg -i text.mp4 -vcodec rawvideo -an -pix_fmt nv12 -s 640x480 -y out.yuv
V4L2_PIX_FMT_YUYV 对应 yuyv422
ffmpeg -i text.mp4 -vcodec rawvideo -an -pix_fmt yuyv422 -s 640x480 -y out.yuv
// 旋转视频
ffmpeg -i input.mp4 -metadata:s:v rotate=“90” -codec copy output.mp4
2.2、./yuv420_infiniteloop /dev/video0 akiyo_qcif.yuv 176 144 30 //往视频设备video0写入YUV数据
说明:akiyo_qcif.yuv是yuv文件,也就是要写入的数据流
176 144 30分别为宽、高的分辨率和帧率的数值
2.3、预览正常
yuv420_infiniteloop /dev/video0 /data/douyin.yuv 640 480 30
2.4、假如有一幅640×480的图片,用yuv422来表示,那么,采样方式就是每个像素采样Y信号,U,V信号隔一个采样,这样算下来,就有640×480个Y,640×240个U,640×240个V,
一幅640×480大小的YUV图片占的总字节数为640×480×2个字节,每像素2个字节,也就是16位。
所以yuyv的一帧字节数为:
setup.frame_bytes = 2 * setup.frame_height * setup.frame_width; //yuyv的一帧字节数
问题点:
如果出现显示颜色异常,那很可能是视频源数据的像素格式fmt等参数没设置对;
如果出现显示画面跳动或者显示不全,可能跟分辨率的设置有关;
如果出现显示完全异常的画面,可能跟视频源文件数据有关,有可能是使用ffmpeg工具生成yuv文件的时候生成的分辨率比原来的分辨率大(比如原来是640x480的MP4文件生成720x1280的yuv文件);
3、使用v4l2_example.c(这里可以放到安卓的代码下mmm编译)可以实现图片采集,这里是一次采集30张图片
4、打开camera预览无画面,开启摄像头闪退
hal层的代码注意修改一下mCamDriverV4l2MemType的参数为V4L2_MEMORY_MMAP;它原来默认配置的是V4L2_MEMORY_OVERLAY;这个属性在hardware/rockchip/camera/CameraHal/CameraSocAdapter.cpp中指定;
5、rk3399 7.1 的HAL中在new CamaerHal对象的时候会根据不同类型的sensor创建不同的adapter,以下是区别:
CameraUSBAdapter: USB接口类型的摄像头,走v4l2.
CameraIspSOCAdapter:dvp接口,isp控制器接收。
CameraIspAdapter:mipi接口,isp控制器接收,不走v4l2.
CameraSOCAdapter:dvp接口,VIP控制器接收。
具体调用:
CameraHal::CameraHal(int cameraId)
:commandThreadCommandQ(“commandCmdQ”)
6、相关代码目录:
app层代码:
packages/apps/Camera2/
framework层代码:
frameworks/av/services/camera/libcameraservice/
hal层代码:
hardware/rockchip/camera/CameraHal/
kernel层代码:
drivers/v4l2loopback/
局部编译生成对应的文件替换:
frameworks/av/camera/cameraserver/ ==> cameraserver
frameworks/av/camera/ ==> libcamera_client.so
frameworks/av/services/camera/libcameraservice/ ==> libcameraservice.so
hardware/rockchip/camera/ ==> camera.rk30board.so
packages/apps/Camera2/ ==> Camera.apk
7、dumpsys media.camera -v //查看摄像头的参数,可以加grep搜索