v4l-utils主要包含两个常用工具,分别是media-ctl、v4l2-ctl
Android系统默认支持
UBUNTU系统安装方法
$ apt-get install v4l-utils
Buildroot系统安装方法
$ vim buildroot/configs/rockchip_rk1808_defconfig
BR2_PACKAGE_LIBV4L_UTILS=y
media-ctl工具的作用
配置拓扑结构中各节点的format、大小、链接
操作/dev/medio0节点
RK3568 Android11.0测试没有此选项
$ media-ctl --known-mbus-fmts
分析输出信息,可获取到设备链路是否正常
$ media-ctl -d /dev/media0 -p
media0设备信息
Media controller API version 0.1.0
Media device information
driver rkisp1 // rkisp1代表media0是rkisp1加载后创建的
model rkisp1
serial
bus info
hw revision 0x0
driver version 0.0.0
ISP设备节点
ISP设备节点比较多,主要关注entity1节点
确认连接的DPHY设备号正常即可
Device topology
- entity 1: rkisp1-isp-subdev (4 pads, 7 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev0
pad0: Sink
[fmt:SRGGB12_1X12/1920x1080 field:none
crop.bounds:(0,0)/1920x1080
crop:(0,0)/1920x1080]
<- "rkisp1_dmapath":0 []
<- "rockchip-mipi-dphy-rx":1 [ENABLED]
pad1: Sink
<- "rkisp1-input-params":0 [ENABLED]
pad2: Source
[fmt:YUYV8_2X8/1920x1080 field:none
crop.bounds:(0,0)/1920x1080
crop:(0,0)/1920x1080]
-> "rkisp1_selfpath":0 [ENABLED]
-> "rkisp1_mainpath":0 [ENABLED]
-> "rkisp1_rawpath":0 [ENABLED]
pad3: Source
-> "rkisp1-statistics":0 [ENABLED]
- entity 2: rkisp1_mainpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video0
pad0: Sink
<- "rkisp1-isp-subdev":2 [ENABLED]
- entity 3: rkisp1_selfpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video1
pad0: Sink
<- "rkisp1-isp-subdev":2 [ENABLED]
- entity 4: rkisp1_rawpath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video2
pad0: Sink
<- "rkisp1-isp-subdev":2 [ENABLED]
- entity 5: rkisp1_dmapath (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video3
pad0: Source
-> "rkisp1-isp-subdev":0 []
- entity 6: rkisp1-statistics (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video4
pad0: Sink
<- "rkisp1-isp-subdev":3 [ENABLED]
- entity 7: rkisp1-input-params (1 pad, 1 link)
type Node subtype V4L flags 0
device node name /dev/video5
pad0: Source
-> "rkisp1-isp-subdev":1 [ENABLED]
DPHY设备节点
- entity 8: rockchip-mipi-dphy-rx (2 pads, 2 links)
type V4L2 subdev subtype Unknown flags 0
device node name /dev/v4l-subdev1
pad0: Sink
[fmt:SRGGB12_1X12/1920x1080 field:none]
<- "m00_b_imx327 2-001a":0 [ENABLED]
pad1: Source
[fmt:SRGGB12_1X12/1920x1080 field:none]
-> "rkisp1-isp-subdev":0 [ENABLED]
Sensor设备节点
- entity 9: m00_b_imx327 2-001a (1 pad, 1 link)
type V4L2 subdev subtype Sensor flags 0
device node name /dev/v4l-subdev2
pad0: Source
[fmt:SRGGB12_1X12/1920x1080@10000/300000 field:none]
-> "rockchip-mipi-dphy-rx":0 [ENABLED]
参数解析:
entity 节点
pad 连接其他entity数量
Source
Sink
link 连线数量
/* 关闭摄像头 */
$ media-ctl -l '"m00_b_imx327":0->"rockchip-mipi-dphy-rx":0[0]'
/* 开启摄像头 */
$ media-ctl -l '"m00_b_imx327":0->"rockchip-mipi-dphy-rx":0[1]'
参数解析:
1、media-ctl -l ‘“entity name”:pad->“entity name”:pad[Status]’
2、整个 link 需要用单引号, 因为有特殊字符如 > [ ]
3、Entity name 需要用双引号, 因为中间有空格
4、Status 用 0 或 1 表示 Active 或 In-Active, 需要用中括号
多摄像头时,只能开启一个
//设置sensor输出分辨率
$ media-ctl -d /dev/media0 --set-v4l2 '"m00_b_imx327 2-001a":0[fmt:SRGGB12_1X12/1920x1080@10000/300000]'
//设置isp的接收(从mipi dphy)格式及大小,格式要求与sensor输出相同
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":0[fmt:SRGGB12_1X12/1920x1080@10000/300000]'
//isp 接收的大小可以 crop(裁剪)(缩小分辨率)
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":0[crop:(0,0)/1920x1080@10000/300000]'
//设置 isp 输出的, YUV 格式只能是 YUYV2X8
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":2[fmt:SRGGB12_1X12/1920x1080@10000/300000]'
//isp 输出也有 crop 功能(缩小分辨率)
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":2[crop:(0,0)/1920x1080@10000/300000]'
$ media-ctl -d /dev/media0 --set-v4l2 '"ov5695 7-0036":0[fmt:SBGGR10_1X10/2592x1944]'
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":0[fmt:SBGGR10_1X10/2592x1944]'
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":0[crop:(0,0)/2592x1944]'
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":2[fmt:YUYV8_2X8/2592x1944]'
$ media-ctl -d /dev/media0 --set-v4l2 '"rkisp1-isp-subdev":2[crop:(0,0)/2592x1944]'
v4l2-ctl工具的作用
配置 v4l2 controls, 可抓帧, 设置 cif、isp、sensor 参数
操作/dev/video0节点
$ v4l2-ctl -d /dev/video4 \
--set-selection=target=crop,top=336,left=432,width=1920,height=1080 \
--set-fmt-video=width=1280,height=720,pixelformat=NV21 \
--stream-mmap=3 --stream-to=/tmp/mp.out --stream-count=20 --stream-poll
参数说明:
–set-selection=target=crop,top=336,left=432,width=1920,height=1080 裁剪,并偏移
$ v4l2-ctl -d /dev/video4 \
--set-ctrl 'exposure=1216,analogue_gain=10' \
--set-selection=target=crop,top=0,left=0,width=2592,height=1944 \
--set-fmt-video=width=2592,height=1944,pixelformat=BG10 \
--stream-mmap=3 --stream-to=/tmp/mp.raw.out --stream-count=1 --stream-poll
// RK1808测试命令
$ v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=1920,height=1080,pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=3 \
--stream-to=/data/NV12.out \
--stream-count=1 \
--stream-poll
// RK3568测试命令
$ v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=1920,height=1080,pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=100 \
--stream-to=/data/NV12.out \
--stream-count=1 \
--stream-poll
参数说明:
-d /dev/video0 指定video设备
–set-fmt-video 指定宽高及pxielformat
pixelformat=NV12 格式 FourCC编码
–stream-mmap 指定 buffer 的类型为 mmap
–stream-skip 指定丢弃(不保存到文件) 前 3 帧
–stream-to 指定帧数据保存的文件路径
–stream-count 指定抓取的帧数
–stream-poll 该选项指示 v4l2-ctl 采用异步 IO
扩展知识:
FourCC与mbus-fmt的区别
mbus-fmt 在物理总线上传输的格式
FourCC 图像视频在内存中存储的格式
RAW图像查看工具:7yuv
下载7yuv工具
使用7yuv工具打开图片(默认格式并不能查看图片内容)
调整解析图片格式(查看datasheet可得知Sensor输出图片格式)
主要调整项:分辨率、格式、位数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AHYUauah-1627094399468)(https://i.loli.net/2021/07/24/zkVtSH7rRxMgGAQ.png)]