0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

V4L2框架概述 Xilinx視頻編解碼詳解

我快閉嘴 ? 來源:Comtech FPGA ? 作者:Jimmy Chen ? 2022-09-14 10:31 ? 次閱讀
  1. 1、V4L2框架概述

  2. V4L2是Video for Linux2的簡稱,為Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動。在Linux中,視頻設(shè)備是設(shè)備文件,可以像訪問普通文件一樣對其進行讀寫。

  3. 1.1 V4L2設(shè)備應(yīng)用層流程

  4. 注冊的設(shè)備節(jié)點有/dev/video和/dev/v4l2-subdev;其應(yīng)用層操作video設(shè)備主要流程如下:

  5. 1) 通過打開video設(shè)備設(shè)置video參數(shù);

  6. 2) 設(shè)置采集方式;

  7. 3) 將數(shù)據(jù)取出、處理、放回,可循環(huán)處理;

  8. 4) 完成相應(yīng)的任務(wù)后關(guān)閉。

  9. 1.2 內(nèi)核V4L2模塊

應(yīng)用層流程可以通過打開文件一樣打開視頻輸入設(shè)備,并且配置設(shè)備相關(guān)參數(shù), 這是由于內(nèi)核相關(guān)模塊做了很多基礎(chǔ)工作。跟V4L2相關(guān)的模塊如下圖所示:

ebaf11b6-33d4-11ed-ba43-dac502259ad0.png

圖1 V4L2基本框架

1.3 典型捕獲管道:

ec0316c6-33d4-11ed-ba43-dac502259ad0.png

圖2 Xilinx視頻典型捕獲管道

  1. 1、硬件視圖

  2. 1)多種組合可以開發(fā)一個捕獲管道;

  3. 2)使用標(biāo)準(zhǔn)化接口(AXI總線接口)在管道中縫合多個IP。

  4. 2、軟件視圖

  5. 1)復(fù)雜性存在于軟件級別,以支持多種組合;

  6. 2)由于沒有任何標(biāo)準(zhǔn)的方法來配置管道中的不同元素,這給軟件開發(fā)人員帶來了更大的復(fù)雜性。

  7. 1.4具有流媒體和/或內(nèi)存接口的基于幀的視頻管道視頻捕獲設(shè)備:

  8. 1)視頻存儲器到存儲器設(shè)備;

  9. 2)視頻輸出設(shè)備(無圖形);

  10. 3)DMABUF:0拷貝緩沖區(qū)共享Media controller;

  11. 4)描述邏輯拓?fù)浜蛿?shù)據(jù)流;

  12. 5)多媒體庫 GStreamer、FFMPEG、OpenCV、OpenMAX、LibAV、VLC媒體播放器、MPlayers。

  13. eca05418-33d4-11ed-ba43-dac502259ad0.png

  14. 圖3 V4L2框架對應(yīng)設(shè)備

  15. 2、Xilinx 視頻編解碼

在使用gst命令創(chuàng)建pipeline 完成視頻輸入到編碼輸出的過程如下:

ece88512-33d4-11ed-ba43-dac502259ad0.png

圖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進行編碼,在使用rtph265pay完成RTP封裝后,在通過udpsink使用udp將編碼后的碼流發(fā)送出去。這個實現(xiàn)我們可以通過V4L2接口來完成,本身gst 插件也是調(diào)用了V4L2接口完成,下面是使用V4L2接口完成上述工作的過程。
  1. 2.1 應(yīng)用程序通過V4L2接口采集視頻數(shù)據(jù)步驟

  2. 1)打開視頻設(shè)備文件,通過視頻采集的參數(shù)初始化, 通過V4L2接口設(shè)置視頻圖像屬性;

  3. 2)申請若干視頻采集的幀緩存區(qū),并將這些幀緩沖區(qū)從內(nèi)核空間映射到用戶空間,便于應(yīng)用程序讀取/處理視頻數(shù)據(jù);

  4. 3)將申請到的幀緩沖區(qū)在視頻采集輸入隊列排隊,并啟動視頻采集;

  5. 4)驅(qū)動開始視頻數(shù)據(jù)的采集,應(yīng)用程序從視頻采集輸出隊列中取出幀緩沖區(qū),處理后,將幀緩沖區(qū)重新放入視頻采集輸入隊列,循環(huán)往復(fù)采集連續(xù)的視頻數(shù)據(jù)。最后停止視頻采集。

流程圖如下所示

ed0d89de-33d4-11ed-ba43-dac502259ad0.png

  1. 2.2 V4L2ioctl控制符

  2. 1)VIDIOC_QUERYCAP 查詢設(shè)備的屬性;

  3. 2)VIDIOC_ENUM_FMT 幀格式;

  4. 3)VIDIOC_S_FMT 設(shè)置視頻幀格式,對應(yīng)struct v4l2_format;

  5. 4)VIDIOC_G_FMT 獲取視頻幀格式等;

  6. 5)VIDIOC_REQBUFS 請求/申請若干個幀緩沖區(qū),一般為不少于3個;

  7. 6)VIDIOC_QUERYBUF 查詢幀緩沖區(qū)在內(nèi)核空間的長度和偏移量;

  8. 7)VIDIOC_QBUF 將申請到的幀緩沖區(qū)全部放入視頻采集輸出隊列;

  9. 8)VIDIOC_STREAMON 開始視頻流數(shù)據(jù)的采集;

  10. 9)VIDIOC_DQBUF 應(yīng)用程序從視頻采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū);

  11. 10)VIDIOC_STREAMOFF 應(yīng)用程序?qū)⒃搸彌_區(qū)重新掛入輸入隊列。

  12. 2.3 控制字符解析和使用用例:

1)VIDIOC_QUERYCAP-------->struct v4l2_capability 例如: if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) ==V4L2_CAP_VIDEO_CAPTURE) { printf("Device %s: supports capture. ", FILE_VIDEO); } if ((cap.capabilities & V4L2_CAP_STREAMING) ==V4L2_CAP_STREAMING) { printf("Device %s: supports streaming. ", FILE_VIDEO); }

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

ed41e4ae-33d4-11ed-ba43-dac502259ad0.png

圖5:Xilinx V4L2 demo

ed6ab5dc-33d4-11ed-ba43-dac502259ad0.png

圖6:Xilinx V4L2 + CTRLSW encode

  1. 3.1Xilinx使用V4L2實現(xiàn)視頻輸入的代碼

  2. edea3ba4-33d4-11ed-ba43-dac502259ad0.png

  3. ee47a3ac-33d4-11ed-ba43-dac502259ad0.png

eeafdf58-33d4-11ed-ba43-dac502259ad0.png

3.2應(yīng)用程序?qū)彌_區(qū)重新排入輸入隊列

ioctl(fd_v4l2,VIDIOC_QBUF, &buf)

ef4e903a-33d4-11ed-ba43-dac502259ad0.pngef7a86e0-33d4-11ed-ba43-dac502259ad0.png
  1. 3.3開始視頻流數(shù)據(jù)的采集

  2. ioctl(fd_v4l2,VIDIOC_STREAMON, &type)

efc36996-33d4-11ed-ba43-dac502259ad0.png

3.4 應(yīng)用程序?qū)⒁曨l采集輸出隊列中取出已含有采集數(shù)據(jù)的幀緩沖區(qū) ioctl(fd_v4l2, VIDIOC_DQBUF, &buf)

f00ae794-33d4-11ed-ba43-dac502259ad0.png

3.5 停止視頻采集 ioctl(fd_v4l2,VIDIOC_STREAMOFF, &tpe)f0390b10-33d4-11ed-ba43-dac502259ad0.png 上面為主要功能函數(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

審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Xilinx
    +關(guān)注

    關(guān)注

    70

    文章

    2137

    瀏覽量

    120396
  • 視頻編解碼
    +關(guān)注

    關(guān)注

    2

    文章

    54

    瀏覽量

    11702
  • V4L2
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    3864

原文標(biāo)題:在Xilinx平臺使用V4L2框架編程實現(xiàn)視頻輸入

文章出處:【微信號:Comtech FPGA,微信公眾號:Comtech FPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Xilinx Linux 如何理解V4L2的管道驅(qū)動程序

    概述 Xilinx提供了完整的V4L2的驅(qū)動程序, Xilinx V4L2 driver 。處于最頂層的驅(qū)動程序是
    的頭像 發(fā)表于 09-30 13:44 ?4755次閱讀
    <b class='flag-5'>Xilinx</b> Linux 如何理解<b class='flag-5'>V4L2</b>的管道驅(qū)動程序

    V853平臺Camera模塊開發(fā)框架詳解

    引入media框架實現(xiàn)pipeline管理 將libisp移植到用戶空間解決GPL問題 將統(tǒng)計buffer獨立為v4l2 subdev 將的scaler(vipp)模塊獨立為v4l2 subdev
    的頭像 發(fā)表于 12-05 14:30 ?5478次閱讀
    <b class='flag-5'>V</b>853平臺Camera模塊開發(fā)<b class='flag-5'>框架</b><b class='flag-5'>詳解</b>

    V4L2視頻采集程序框架

    V4L2視頻采集程序框架
    發(fā)表于 11-05 12:44

    DM6446 V4L2采集驅(qū)動和輸出驅(qū)動與硬件工作原理

    Montavista 的Linux-2.6.18 V4L2好好分析一下,順便講解在產(chǎn)品中的應(yīng)用,滿足一些客戶提出要求,畢竟V4L2是LINUX一個很重要的視頻驅(qū)動,適合很多嵌入式芯片平臺。本文首先講解DM6446
    發(fā)表于 08-02 07:39

    基于PCIe和V4L2的8通道視頻采集&顯示IP

    基于PCIe和V4L2的8通道視頻采集&顯示IPVideo Capture&Display IP for V4L2在主機端視頻設(shè)備內(nèi)核驅(qū)動V4L2
    發(fā)表于 11-01 21:45

    什么是V4L2?有何作用

    1.什么是V4L2Video for(4) Linux 2 的簡稱,V4L的升級版。V4L2是linux操作系統(tǒng)下用于采集圖片、
    發(fā)表于 01-17 09:05

    Chromium V4L2視頻解碼的功能問題求解

    我正在為 IMX8MM 使用 Yocto Langdale 版本。根據(jù)此提交消息,此版本應(yīng)在 Chromium 中啟用 V4L2 硬件視頻解碼:提交
    發(fā)表于 04-10 13:46

    需要了解Linux V4L2的驅(qū)動架構(gòu)

    video4linux2(V4L2)是Linux內(nèi)核中關(guān)于視頻設(shè)備的中間驅(qū)動層,向上為Linux應(yīng)用程序訪問視頻設(shè)備提供了通用接口,向下為linux中設(shè)備驅(qū)動程序開發(fā)提供了統(tǒng)一的
    發(fā)表于 04-28 17:29 ?1058次閱讀
    需要了解Linux <b class='flag-5'>V4L2</b>的驅(qū)動架構(gòu)

    學(xué)習(xí)V4L2應(yīng)用程序框架時要注意的事項

    V4L2采用流水線的方式,操作更簡單直觀,基本遵循打開視頻設(shè)備、設(shè)置格式、處理數(shù)據(jù)、關(guān)閉設(shè)備,更多的具體操作通過ioctl函數(shù)來實現(xiàn)。
    發(fā)表于 05-14 14:00 ?1277次閱讀
    學(xué)習(xí)<b class='flag-5'>V4L2</b>應(yīng)用程序<b class='flag-5'>框架</b>時要注意的事項

    Linux應(yīng)用開發(fā)【第七章】攝像頭V4L2編程應(yīng)用開發(fā)

    文章目錄 7 攝像頭V4L2編程應(yīng)用開發(fā) 7.1 V4L2簡介 7.2 V4L2視頻采集原理 7.3 V4L2程序?qū)崿F(xiàn)流程 7.4
    的頭像 發(fā)表于 12-10 19:23 ?2944次閱讀
    Linux應(yīng)用開發(fā)【第七章】攝像頭<b class='flag-5'>V4L2</b>編程應(yīng)用開發(fā)

    V4L2學(xué)習(xí)筆記

    1.什么是V4L2Video for(4) Linux 2 的簡稱,V4L的升級版。V4L2是linux操作系統(tǒng)下用于采集圖片、
    發(fā)表于 01-17 13:43 ?12次下載
    <b class='flag-5'>V4L2</b>學(xué)習(xí)筆記

    如何使用v4l2 API讀取攝像頭

    V4L2是Video For Linux的第二個版本,它是Linux的視頻捕獲的API。在這里,您可以找到有關(guān)的文檔。它提供了很方便的c,c++和python接口
    發(fā)表于 02-07 11:16 ?4次下載
    如何使用<b class='flag-5'>v4l2</b> API讀取攝像頭

    Linux內(nèi)核中視頻設(shè)備驅(qū)動框架V4L2X詳解

    V4L2(Video for Linux 2):Linux內(nèi)核中關(guān)于視頻設(shè)備驅(qū)動的框架,對上向應(yīng)用層提供統(tǒng)一的接口,對下支持各類復(fù)雜硬件的靈活擴展.
    的頭像 發(fā)表于 05-30 16:18 ?5760次閱讀

    修改V4L2的Video Pipeline的devicetree

    PetaLinux 能夠根據(jù)Vivado的設(shè)計,自動生成V4L2的Video Pipeline的devicetree。但是它主要為Xilinx的VCU TRD服務(wù),測試的組合比較少。很多時候,需要根據(jù)自己的工程,修改V4L2的V
    的頭像 發(fā)表于 08-02 08:03 ?1965次閱讀
    修改<b class='flag-5'>V4L2</b>的Video Pipeline的devicetree

    v4l2編程

    v4l2編程
    發(fā)表于 10-28 11:10 ?0次下載