-
1、V4L2框架概述
-
V4L2是Video for Linux2的簡稱,為Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動。在Linux中,視頻設(shè)備是設(shè)備文件,可以像訪問普通文件一樣對其進(jìn)行讀寫。
-
1.1 V4L2設(shè)備應(yīng)用層流程
-
注冊的設(shè)備節(jié)點(diǎn)有/dev/video和/dev/v4l2-subdev;其應(yīng)用層操作video設(shè)備主要流程如下:
-
1) 通過打開video設(shè)備設(shè)置video參數(shù);
-
2) 設(shè)置采集方式;
-
3) 將數(shù)據(jù)取出、處理、放回,可循環(huán)處理;
-
4) 完成相應(yīng)的任務(wù)后關(guān)閉。
-
-
1.2 內(nèi)核V4L2模塊
應(yīng)用層流程可以通過打開文件一樣打開視頻輸入設(shè)備,并且配置設(shè)備相關(guān)參數(shù), 這是由于內(nèi)核相關(guān)模塊做了很多基礎(chǔ)工作。跟V4L2相關(guān)的模塊如下圖所示:
圖1 V4L2基本框架
1.3 典型捕獲管道:
圖2 Xilinx視頻典型捕獲管道
-
1、硬件視圖
-
1)多種組合可以開發(fā)一個捕獲管道;
-
2)使用標(biāo)準(zhǔn)化接口(AXI總線接口)在管道中縫合多個IP。
-
2、軟件視圖
-
1)復(fù)雜性存在于軟件級別,以支持多種組合;
-
2)由于沒有任何標(biāo)準(zhǔn)的方法來配置管道中的不同元素,這給軟件開發(fā)人員帶來了更大的復(fù)雜性。
-
-
1.4具有流媒體和/或內(nèi)存接口的基于幀的視頻管道視頻捕獲設(shè)備:
-
1)視頻存儲器到存儲器設(shè)備;
-
2)視頻輸出設(shè)備(無圖形);
-
3)DMABUF:0拷貝緩沖區(qū)共享Media controller;
-
4)描述邏輯拓?fù)浜蛿?shù)據(jù)流;
-
5)多媒體庫 GStreamer、FFMPEG、OpenCV、OpenMAX、LibAV、VLC媒體播放器、MPlayers。
-
-
-
圖3 V4L2框架對應(yīng)設(shè)備
-
-
2、Xilinx 視頻編解碼
在使用gst命令創(chuàng)建pipeline 完成視頻輸入到編碼輸出的過程如下:
圖4 Xilinx 視頻輸入設(shè)備及相關(guān)內(nèi)核模塊
當(dāng)使用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設(shè)備對應(yīng)我們的HDMI輸入,使用omxh265enc進(jìn)行編碼,在使用rtph265pay完成RTP封裝后,在通過udpsink使用udp將編碼后的碼流發(fā)送出去。這個實現(xiàn)我們可以通過V4L2接口來完成,本身gst 插件也是調(diào)用了V4L2接口完成,下面是使用V4L2接口完成上述工作的過程。-
2.1 應(yīng)用程序通過V4L2接口采集視頻數(shù)據(jù)步驟
-
1)打開視頻設(shè)備文件,通過視頻采集的參數(shù)初始化, 通過V4L2接口設(shè)置視頻圖像屬性;
-
2)申請若干視頻采集的幀緩存區(qū),并將這些幀緩沖區(qū)從內(nèi)核空間映射到用戶空間,便于應(yīng)用程序讀取/處理視頻數(shù)據(jù);
-
3)將申請到的幀緩沖區(qū)在視頻采集輸入隊列排隊,并啟動視頻采集;
-
4)驅(qū)動開始視頻數(shù)據(jù)的采集,應(yīng)用程序從視頻采集輸出隊列中取出幀緩沖區(qū),處理后,將幀緩沖區(qū)重新放入視頻采集輸入隊列,循環(huán)往復(fù)采集連續(xù)的視頻數(shù)據(jù)。最后停止視頻采集。
流程圖如下所示
-
2.2 V4L2ioctl控制符
-
1)VIDIOC_QUERYCAP 查詢設(shè)備的屬性;
-
2)VIDIOC_ENUM_FMT 幀格式;
-
3)VIDIOC_S_FMT 設(shè)置視頻幀格式,對應(yīng)struct v4l2_format;
-
4)VIDIOC_G_FMT 獲取視頻幀格式等;
-
5)VIDIOC_REQBUFS 請求/申請若干個幀緩沖區(qū),一般為不少于3個;
-
6)VIDIOC_QUERYBUF 查詢幀緩沖區(qū)在內(nèi)核空間的長度和偏移量;
-
7)VIDIOC_QBUF 將申請到的幀緩沖區(qū)全部放入視頻采集輸出隊列;
-
8)VIDIOC_STREAMON 開始視頻流數(shù)據(jù)的采集;
-
9)VIDIOC_DQBUF 應(yīng)用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū);
-
10)VIDIOC_STREAMOFF 應(yīng)用程序?qū)⒃搸彌_區(qū)重新掛入輸入隊列。
-
-
2.3 控制字符解析和使用用例:
2)VIDIOC_ENUM_FMT-------->struct v4l2_fmtdesc
//通過這個結(jié)構(gòu)體,可以顯示對應(yīng)的攝像頭所支持視頻幀格式。例如
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 設(shè)置視頻幀格式 5) VIDIOC_CROPCAP-------->struct v4l2_cropcap結(jié)構(gòu)體 6)設(shè)置Stream信息,主要設(shè)置幀率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 7)設(shè)置Stream信息,主要設(shè)置幀率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 8)設(shè)置Stream信息,主要設(shè)置幀率 VIDIOC_G_PARM&VIDIOC_S_PARM-------->structv4l2_streamparm 9)申請和管理緩沖區(qū) VIDIOC_REQBUFS-------->struct v4l2_requestbuffers 10) 應(yīng)用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) VIDIOC_QUERYBUF-------->struct v4l2_buffer 應(yīng)用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) intioctl(intfd,VIDIOC_DQBUF, structv4l2_buffer*argp) 11) 開始視頻采集和關(guān)閉視頻采集 VIDIOC_STREAMON&VIDIOC_STREAMOFF int ioctl(int fd, VIDIOC_STREAMON, const int *argp) int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp) 12) 應(yīng)用程序?qū)⒃搸彌_區(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應(yīng)用程序?qū)彌_區(qū)重新排入輸入隊列
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開始視頻流數(shù)據(jù)的采集
-
ioctl(fd_v4l2,VIDIOC_STREAMON, &type)
3.4 應(yīng)用程序?qū)⒁曨l采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) ioctl(fd_v4l2, VIDIOC_DQBUF, &buf)
![f0390b10-33d4-11ed-ba43-dac502259ad0.png](https://file1.elecfans.com//web2/M00/96/6D/wKgZomTnH2iAcUyDAAEZ8ozHo7o380.png)
審核編輯:湯梓紅
-
Xilinx
+關(guān)注
關(guān)注
71文章
2171瀏覽量
122190 -
視頻編解碼
+關(guān)注
關(guān)注
2文章
54瀏覽量
11801 -
V4L2
+關(guān)注
關(guān)注
0文章
17瀏覽量
3926
原文標(biāo)題:在Xilinx平臺使用V4L2框架編程實現(xiàn)視頻輸入
文章出處:【微信號:Comtech FPGA,微信公眾號:Comtech FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
V853平臺Camera模塊開發(fā)框架詳解
![<b class='flag-5'>V</b>853平臺Camera模塊開發(fā)<b class='flag-5'>框架</b><b class='flag-5'>詳解</b>](https://file.elecfans.com/web2/M00/81/1C/pYYBAGONkG-AG9H1AACpUXGkBIY562.png)
DM6446 V4L2采集驅(qū)動和輸出驅(qū)動與硬件工作原理
基于PCIe和V4L2的8通道視頻采集&顯示IP
什么是V4L2?有何作用
Chromium V4L2視頻解碼的功能問題求解
需要了解Linux V4L2的驅(qū)動架構(gòu)
![需要了解Linux <b class='flag-5'>V4L2</b>的驅(qū)動架構(gòu)](https://file.elecfans.com/web1/M00/90/A0/pIYBAFzFcj2AHajyAAF2cjgshbE989.png)
學(xué)習(xí)V4L2應(yīng)用程序框架時要注意的事項
![學(xué)習(xí)<b class='flag-5'>V4L2</b>應(yīng)用程序<b class='flag-5'>框架</b>時要注意的事項](https://file.elecfans.com/web1/M00/91/B8/o4YBAFzaWVyAUTsnAACgtwl1BaU751.png)
Linux應(yīng)用開發(fā)【第七章】攝像頭V4L2編程應(yīng)用開發(fā)
![Linux應(yīng)用開發(fā)【第七章】攝像頭<b class='flag-5'>V4L2</b>編程應(yīng)用開發(fā)](https://file.elecfans.com//web2/M00/24/EE/pYYBAGGzOMaAf72oAAEg9RkTlq0902.png)
V4L2學(xué)習(xí)筆記
![<b class='flag-5'>V4L2</b>學(xué)習(xí)筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
如何使用v4l2 API讀取攝像頭
![如何使用<b class='flag-5'>v4l2</b> API讀取攝像頭](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Linux內(nèi)核中視頻設(shè)備驅(qū)動框架V4L2X詳解
修改V4L2的Video Pipeline的devicetree
![修改<b class='flag-5'>V4L2</b>的Video Pipeline的devicetree](https://file.elecfans.com/web2/M00/1F/61/poYBAGGYHdSAPcpPAAX6GDk5EhQ786.jpg)
評論