-
1、V4L2框架概述
-
V4L2是Video for Linux2的简称,为Linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。
-
1.1 V4L2设备应用层流程
-
注册的设备节点有/dev/video和/dev/v4l2-subdev;其应用层操作video设备主要流程如下:
-
1) 通过打开video设备设置video参数;
-
2) 设置采集方式;
-
3) 将数据取出、处理、放回,可循环处理;
-
4) 完成相应的任务后关闭。
-
-
1.2 内核V4L2模块
应用层流程可以通过打开文件一样打开视频输入设备,并且配置设备相关参数, 这是由于内核相关模块做了很多基础工作。跟V4L2相关的模块如下图所示:
图1 V4L2基本框架
1.3 典型捕获管道:
图2 Xilinx视频典型捕获管道
-
1、硬件视图
-
1)多种组合可以开发一个捕获管道;
-
2)使用标准化接口(AXI总线接口)在管道中缝合多个IP。
-
2、软件视图
-
1)复杂性存在于软件级别,以支持多种组合;
-
2)由于没有任何标准的方法来配置管道中的不同元素,这给软件开发人员带来了更大的复杂性。
-
-
1.4具有流媒体和/或内存接口的基于帧的视频管道视频捕获设备:
-
1)视频存储器到存储器设备;
-
2)视频输出设备(无图形);
-
3)DMABUF:0拷贝缓冲区共享Media controller;
-
4)描述逻辑拓扑和数据流;
-
5)多媒体库 GStreamer、FFMPEG、OpenCV、OpenMAX、LibAV、VLC媒体播放器、MPlayers。
-
-
-
图3 V4L2框架对应设备
-
-
2、Xilinx 视频编解码
在使用gst命令创建pipeline 完成视频输入到编码输出的过程如下:
图4 Xilinx 视频输入设备及相关内核模块
当使用gst 命令处理HDMI视频输入时,我们会使用下面的命令:gst-launch-1.0 -v v4l2src device=/dev/video0 io-mode=4 !video/x-raw(memory:XLNXLL), format=NV16_10LE32, width=3840, height=2160,framerate=60/1 ! omxh265enc num-slices=8 periodicity-idr=240 cpb-size=500gdr-mode=horizontal initial-delay=250 control-rate=low-latencyprefetch-buffer=true target-bitrate=25000 gop-mode=low-delay-p ! video/x-h265,alignment=nal ! rtph265pay ! udpsink buffer-size=60000000 host=192.168.25.89port=5004 async=false max-lateness=-1 qos-dscp=60 max-bitrate=120000000 -v 其中/dev/video0设备对应我们的HDMI输入,使用omxh265enc进行编码,在使用rtph265pay完成RTP封装后,在通过udpsink使用udp将编码后的码流发送出去。这个实现我们可以通过V4L2接口来完成,本身gst 插件也是调用了V4L2接口完成,下面是使用V4L2接口完成上述工作的过程。-
2.1 应用程序通过V4L2接口采集视频数据步骤
-
1)打开视频设备文件,通过视频采集的参数初始化, 通过V4L2接口设置视频图像属性;
-
2)申请若干视频采集的帧缓存区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;
-
3)将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;
-
4)驱动开始视频数据的采集,应用程序从视频采集输出队列中取出帧缓冲区,处理后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据。最后停止视频采集。
流程图如下所示
-
2.2 V4L2ioctl控制符
-
1)VIDIOC_QUERYCAP 查询设备的属性;
-
2)VIDIOC_ENUM_FMT 帧格式;
-
3)VIDIOC_S_FMT 设置视频帧格式,对应struct v4l2_format;
-
4)VIDIOC_G_FMT 获取视频帧格式等;
-
5)VIDIOC_REQBUFS 请求/申请若干个帧缓冲区,一般为不少于3个;
-
6)VIDIOC_QUERYBUF 查询帧缓冲区在内核空间的长度和偏移量;
-
7)VIDIOC_QBUF 将申请到的帧缓冲区全部放入视频采集输出队列;
-
8)VIDIOC_STREAMON 开始视频流数据的采集;
-
9)VIDIOC_DQBUF 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区;
-
10)VIDIOC_STREAMOFF 应用程序将该帧缓冲区重新挂入输入队列。
-
-
2.3 控制字符解析和使用用例:
2)VIDIOC_ENUM_FMT-------->struct v4l2_fmtdesc
//通过这个结构体,可以显示对应的摄像头所支持视频帧格式。例如
struct v4l2_fmtdesc fmtdesc; fmtdesc.index = 0; fmtdesc.type =V4L2_BUF_TYPE_VIDEO_CAPTURE; printf("Supportformat:/n"); while(ioctl(fd, VIDIOC_ENUM_FMT, &fmtdesc) != -1) { printf("/t%d.%s/n",fmtdesc.index+1,fmtdesc.description); fmtdesc.index++; } 3)VIDIOC_G_FMT-------->struct v4l2_format 查看视频帧格式 4)VIDIOC_S_FMT 设置视频帧格式 5) VIDIOC_CROPCAP-------->struct v4l2_cropcap结构体 6)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 7)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 8)设置Stream信息,主要设置帧率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 9)申请和管理缓冲区 VIDIOC_REQBUFS-------->struct v4l2_requestbuffers 10) 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区 VIDIOC_QUERYBUF-------->struct v4l2_buffer 应用程序从视频采集输出队列中取出已含有采集数据的帧缓冲区 intioctl(intfd,VIDIOC_DQBUF, structv4l2_buffer*argp) 11) 开始视频采集和关闭视频采集 VIDIOC_STREAMON&VIDIOC_STREAMOFF int ioctl(int fd, VIDIOC_STREAMON, const int *argp) int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp) 12) 应用程序将该帧缓冲区重新挂入输入队列VIDIOC_QBUF intioctl(intfd,VIDIOC_QBUF,structv4l2_buffer*argp)3、Xilinx V4L2 Demo
图5:Xilinx V4L2 demo
图6:Xilinx V4L2 + CTRLSW encode
-
3.1Xilinx使用V4L2实现视频输入的代码
-
-
-
3.2应用程序将帧缓冲区重新排入输入队列
ioctl(fd_v4l2,VIDIOC_QBUF, &buf)
![ef4e903a-33d4-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/6D/wKgZomTnH2eAWB2iAAKuFgNytU8349.png)
![ef7a86e0-33d4-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/6D/wKgZomTnH2iAVBaVAAOCNHr0PS8937.png)
-
3.3开始视频流数据的采集
-
ioctl(fd_v4l2,VIDIOC_STREAMON, &type)
3.4 应用程序将视频采集输出队列中取出已含有采集数据的帧缓冲区 ioctl(fd_v4l2, VIDIOC_DQBUF, &buf)
![f0390b10-33d4-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/6D/wKgZomTnH2iAcUyDAAEZ8ozHo7o380.png)
审核编辑:汤梓红
-
Xilinx
+关注
关注
71文章
2172浏览量
122346 -
视频编解码
+关注
关注
2文章
54浏览量
11815 -
V4L2
+关注
关注
0文章
17浏览量
3930
原文标题:在Xilinx平台使用V4L2框架编程实现视频输入
文章出处:【微信号:Comtech FPGA,微信公众号:Comtech FPGA】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
V853平台Camera模块开发框架详解
![<b class='flag-5'>V</b>853平台Camera模块开发<b class='flag-5'>框架</b><b class='flag-5'>详解</b>](https://file.elecfans.com/web2/M00/81/1C/pYYBAGONkG-AG9H1AACpUXGkBIY562.png)
DM6446 V4L2采集驱动和输出驱动与硬件工作原理
基于PCIe和V4L2的8通道视频采集&显示IP
Chromium V4L2视频解码的功能问题求解
需要了解Linux V4L2的驱动架构
![需要了解Linux <b class='flag-5'>V4L2</b>的驱动架构](https://file.elecfans.com/web1/M00/90/A0/pIYBAFzFcj2AHajyAAF2cjgshbE989.png)
学习V4L2应用程序框架时要注意的事项
![学习<b class='flag-5'>V4L2</b>应用程序<b class='flag-5'>框架</b>时要注意的事项](https://file.elecfans.com/web1/M00/91/B8/o4YBAFzaWVyAUTsnAACgtwl1BaU751.png)
如何使用v4l2 API读取摄像头
![如何使用<b class='flag-5'>v4l2</b> API读取摄像头](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux内核中视频设备驱动框架V4L2X详解
修改V4L2的Video Pipeline的devicetree
![修改<b class='flag-5'>V4L2</b>的Video Pipeline的devicetree](https://file.elecfans.com/web2/M00/1F/61/poYBAGGYHdSAPcpPAAX6GDk5EhQ786.jpg)
评论