-
1、V4L2框架概述
-
V4L2是Video for Linux2的簡稱,為Linux中關于視頻設備的內核驅動。在Linux中,視頻設備是設備文件,可以像訪問普通文件一樣對其進行讀寫。
-
1.1 V4L2設備應用層流程
-
注冊的設備節(jié)點有/dev/video和/dev/v4l2-subdev;其應用層操作video設備主要流程如下:
-
1) 通過打開video設備設置video參數(shù);
-
2) 設置采集方式;
-
3) 將數(shù)據(jù)取出、處理、放回,可循環(huán)處理;
-
4) 完成相應的任務后關閉。
-
-
1.2 內核V4L2模塊
應用層流程可以通過打開文件一樣打開視頻輸入設備,并且配置設備相關參數(shù), 這是由于內核相關模塊做了很多基礎工作。跟V4L2相關的模塊如下圖所示:
圖1 V4L2基本框架
1.3 典型捕獲管道:
圖2 Xilinx視頻典型捕獲管道
-
1、硬件視圖
-
1)多種組合可以開發(fā)一個捕獲管道;
-
2)使用標準化接口(AXI總線接口)在管道中縫合多個IP。
-
2、軟件視圖
-
1)復雜性存在于軟件級別,以支持多種組合;
-
2)由于沒有任何標準的方法來配置管道中的不同元素,這給軟件開發(fā)人員帶來了更大的復雜性。
-
-
1.4具有流媒體和/或內存接口的基于幀的視頻管道視頻捕獲設備:
-
1)視頻存儲器到存儲器設備;
-
2)視頻輸出設備(無圖形);
-
3)DMABUF:0拷貝緩沖區(qū)共享Media controller;
-
4)描述邏輯拓撲和數(shù)據(jù)流;
-
5)多媒體庫 GStreamer、FFMPEG、OpenCV、OpenMAX、LibAV、VLC媒體播放器、MPlayers。
-
-
-
圖3 V4L2框架對應設備
-
-
2、Xilinx 視頻編解碼
在使用gst命令創(chuàng)建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將編碼后的碼流發(fā)送出去。這個實現(xiàn)我們可以通過V4L2接口來完成,本身gst 插件也是調用了V4L2接口完成,下面是使用V4L2接口完成上述工作的過程。-
2.1 應用程序通過V4L2接口采集視頻數(shù)據(jù)步驟
-
1)打開視頻設備文件,通過視頻采集的參數(shù)初始化, 通過V4L2接口設置視頻圖像屬性;
-
2)申請若干視頻采集的幀緩存區(qū),并將這些幀緩沖區(qū)從內核空間映射到用戶空間,便于應用程序讀取/處理視頻數(shù)據(jù);
-
3)將申請到的幀緩沖區(qū)在視頻采集輸入隊列排隊,并啟動視頻采集;
-
4)驅動開始視頻數(shù)據(jù)的采集,應用程序從視頻采集輸出隊列中取出幀緩沖區(qū),處理后,將幀緩沖區(qū)重新放入視頻采集輸入隊列,循環(huán)往復采集連續(xù)的視頻數(shù)據(jù)。最后停止視頻采集。
流程圖如下所示
-
2.2 V4L2ioctl控制符
-
1)VIDIOC_QUERYCAP 查詢設備的屬性;
-
2)VIDIOC_ENUM_FMT 幀格式;
-
3)VIDIOC_S_FMT 設置視頻幀格式,對應struct v4l2_format;
-
4)VIDIOC_G_FMT 獲取視頻幀格式等;
-
5)VIDIOC_REQBUFS 請求/申請若干個幀緩沖區(qū),一般為不少于3個;
-
6)VIDIOC_QUERYBUF 查詢幀緩沖區(qū)在內核空間的長度和偏移量;
-
7)VIDIOC_QBUF 將申請到的幀緩沖區(qū)全部放入視頻采集輸出隊列;
-
8)VIDIOC_STREAMON 開始視頻流數(shù)據(jù)的采集;
-
9)VIDIOC_DQBUF 應用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū);
-
10)VIDIOC_STREAMOFF 應用程序將該幀緩沖區(qū)重新掛入輸入隊列。
-
-
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)申請和管理緩沖區(qū) VIDIOC_REQBUFS-------->struct v4l2_requestbuffers 10) 應用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) VIDIOC_QUERYBUF-------->struct v4l2_buffer 應用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) 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) 應用程序將該幀緩沖區(qū)重新掛入輸入隊列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實現(xiàn)視頻輸入的代碼
-
-
-
3.2應用程序將幀緩沖區(qū)重新排入輸入隊列
ioctl(fd_v4l2,VIDIOC_QBUF, &buf)
-
3.3開始視頻流數(shù)據(jù)的采集
-
ioctl(fd_v4l2,VIDIOC_STREAMON, &type)
3.4 應用程序將視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) ioctl(fd_v4l2, VIDIOC_DQBUF, &buf)
3.5 停止視頻采集 ioctl(fd_v4l2,VIDIOC_STREAMOFF, &tpe) 上面為主要功能函數(shù)介紹,具體代碼等等請參考如下鏈接:https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1010303367/Zynq+UltraScale+MPSoC+VCU+TRD+2020.2+-+Xilinx+Low+Latency+PS+DDR+NV12+HDMI+Audio+Video+Capture+and+Display
審核編輯:湯梓紅
-
Xilinx
+關注
關注
71文章
2167瀏覽量
121308 -
視頻編解碼
+關注
關注
2文章
54瀏覽量
11748 -
V4L2
+關注
關注
0文章
17瀏覽量
3894
原文標題:在Xilinx平臺使用V4L2框架編程實現(xiàn)視頻輸入
文章出處:【微信號:Comtech FPGA,微信公眾號:Comtech FPGA】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論