rk3399_android7.1使用v4l2loopback实现虚拟camera开发记录

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搜索

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零意@

您的打赏将是我继续创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值