主頁 > 軟體工程 > Hi3559AV100外接UVC/MJPEG相機實時采圖設計(二):V4L2介面的實作(以YUV422為例)

Hi3559AV100外接UVC/MJPEG相機實時采圖設計(二):V4L2介面的實作(以YUV422為例)

2021-02-16 11:57:14 軟體工程

  下面將給出Hi3559AV100外接UVC/MJPEG相機實時采圖設計的整體流程,主要實作是通過V4L2介面將UVC/MJPEG相機采集的資料送入至MPP平臺,經過VDEC、VPSS、VO最后通過HDMI的輸出,給出(二)V4L2介面的實作,

可以先參照前面隨筆介紹(一)Linux USB攝像頭驅動加載與分析:https://www.cnblogs.com/iFrank/p/14399421.html

板載平臺:BOXER-8410AI

芯片型號:Hi3559AV100

相機型號:Logitch c270

開發環境:VM15.5+ubuntu16.04+Hilinux

1、V4L2介面說明

  V4L2是Video for linux2的簡稱,為linux中關于視頻設備的內核驅動,在Linux中,視頻設備是設備檔案,可以像訪問普通檔案一樣對其進行讀寫,攝像頭在/dev/video*下,如果只有一個視頻設備,通常為/dev/video0,V4L2是內核提供給應用程式訪問音、視頻驅動的統一介面,V4L2 的相關定義包含在頭檔案<linux/videodev2.h> 中,

  V4L2 支持兩種方式來采集影像:記憶體映射(mmap)和直接讀取方式(read),V4L2 在/usr/include/linux/videodev2.h 檔案下定義了一些重要的資料結構,在采集影像的程序中,就是通過對這些資料的操作來獲得最終的影像資料,Linux 系統 V4L2 使能可在內核編譯階段配置,默認情況下是在 make menuconfig 是打開的,應用程式可以通過 V4L2 進行視頻采集,V4L2 支持記憶體映射(mmap)方式和直接讀取方式(read)方式采集資料,前者 一般用于連續的視頻資料采集,后者常用靜態圖片資料采集,v4l2 中不僅定義了通用 API 元素,影像的格式,輸入/輸出方法,還定義了Linux 內核驅動處理視頻資訊的一系列介面,這些介面主要有:   視頻采集介面——Video Capture interface;   視頻輸出介面——Video Output Interface;   視頻覆寫/預覽介面——Video Overlay Interface;   視頻輸出覆寫介面——Video Output Overlay Interface;   編解碼介面——Codec Interface

IOCTL的實作V4L2的控制

  打開視頻設備后,可以設定該視頻設備的屬性,例如裁剪、縮放等,這一步是可選的,在Linux編程中,一般使用ioctl函式來對設備的I/O通道進行管理: extern int ioctl (int __fd, unsigned long int __request, …) __THROW; __fd:設備的ID,例如剛才用open函式打開視頻通道后回傳的cameraFd; __request:具體的命令標志符, 在進行V4L2開發中,一般會用到以下的命令標志符:
 1:分配記憶體
 2 VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的資料快取轉換成物理地址
 3 VIDIOC_QUERYCAP:查詢驅動功能
 4 VIDIOC_ENUM_FMT:獲取當前驅動支持的視頻格式
 5 VIDIOC_S_FMT:設定當前驅動的頻捕獲格式
 6 VIDIOC_G_FMT:讀取當前驅動的頻捕獲格式
 7 VIDIOC_TRY_FMT:驗證當前驅動的顯示格式
 8 VIDIOC_CROPCAP:查詢驅動的修剪能力
 9 VIDIOC_S_CROP:設定視頻信號的邊框
10 VIDIOC_G_CROP:讀取視頻信號的邊框
11 VIDIOC_QBUF:把資料放回快取佇列
12 VIDIOC_DQBUF:把資料從快取中讀取出來
13 VIDIOC_STREAMON:開始視頻顯示函式
14 VIDIOC_STREAMOFF:結束視頻顯示函式
15 VIDIOC_QUERYSTD:檢查當前視頻設備支持的標準,例如PAL或NTSC,

這些IO呼叫,有些是必須的,有些是可選擇的,其命令標志符在在頭檔案<linux/videodev2.h> 定義,具體如下:

1 #define VIDIOC_QUERYCAP         _IOR('V',  0, struct v4l2_capability)
2 #define VIDIOC_RESERVED          _IO('V',  1)
3 #define VIDIOC_ENUM_FMT         _IOWR('V',  2, struct v4l2_fmtdesc)
4 #define VIDIOC_G_FMT        _IOWR('V',  4, struct v4l2_format)
5 #define VIDIOC_S_FMT        _IOWR('V',  5, struct v4l2_format)
6 #define VIDIOC_REQBUFS        _IOWR('V',  8, struct v4l2_requestbuffers)

Logitch c270支持的像素格式有兩種:

 1 YUYV 4:2:2 2 Motion-JPEG 

2、V4L2的實作流程

一般來說V4L2 采集視頻資料分為五個步驟:   首先,打開視頻設備檔案,進行視頻采集的引數初始化,通過 V4L2 介面設定視頻影像的采集視窗、采集的點陣大小和格式;   其次,申請若干視頻采集的幀緩沖區,并將這些幀緩沖區從內核空間映射到用戶空間,便于應用程式讀取/處理視頻資料;   第三,將申請到的幀緩沖區在視頻采集輸入佇列排隊,并啟動視頻采集;   第四,驅動開始視頻資料的采集,應用程式從視頻采集輸出佇列取出幀緩沖區,處理完后,將幀緩沖區重新放入視頻采集輸入佇列,回圈往復采      集連續的視頻資料;   第五,停止視頻采集,在本次設計中,定義了幾個函式實作對攝像頭的配置和采集, 一幀圖片采集流程:


 動態視頻采集流程:

 

  圖解程序已經很詳細了,重新總結下,整個程序:   首先:先啟動視頻采集,驅動程式開始采集一幀資料,把采集的資料放入視頻采集輸入佇列的第一個幀緩沖區,一幀資料采集完成,也就是第 一個幀緩沖區存滿一幀資料后,驅動程式將該幀緩沖區移至視頻采集輸出佇列,等待應用程式從輸出佇列取出,驅動程式則繼續采集下一幀資料放入第二個緩沖區,同樣幀緩沖區存滿下一幀資料后,被放入視頻采集輸出佇列,   然后:應用程式從視頻采集輸出佇列中取出含有視頻資料的幀緩沖區,處理幀緩沖區中的視頻資料,如存盤或壓縮,   最后:應用程式將處理完資料的幀緩沖區重新放入視頻采集輸入佇列,這樣可以回圈采集,我們從攝像頭中獲取的視頻幀資料會放入視頻快取佇列中,當其他模塊需要處理對應的視頻幀的時候,就會占用快取塊,也就是這一塊記憶體被占用,當處理完之后,對應的資料通過 VO/VENC/VDA 顯示之后,這一快取塊就沒有用了,可以回收利用,現在來看,其實海思的底層處理和 linux 的底層處理是一樣的,不過海思本身使用的就是 linux 內核,應該也就是對這一塊進行封裝了而已吧!   海思的公共視頻快取池按我的理解應該有兩部分,一部分是視頻采集輸入佇列,另一部分是視頻采集輸出佇列,VI 通道是是視頻采集輸出佇列中獲取的視頻幀,而中間 linux 內核的驅動程式會在視頻采集輸入佇列中填充視頻幀,變成視頻輸出佇列,

部分代碼實作:

 1     /*打開視頻*/
 2     if ((fd = open(FILE_VIDEO, O_RDWR)) == -1) 
 3     {
 4           printf("Error opening V4L interface\n");
 5           return (FALSE);
 6     }
 7     
 8     /*讀video_capability中資訊,
 9     通過呼叫IOCTL函式和介面命令VIDIOC_QUERYCAP查詢
10     攝像頭的資訊*/
11     if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == -1)
12     {
13         printf("Error opening device %s: unable to query device.\n",FILE_VIDEO);
14         return (FALSE);
15     }
16     else
17     {
18         printf("driver:\t\t%s\n",cap.driver);
19         printf("card:\t\t%s\n",cap.card);
20         printf("bus_info:\t%s\n",cap.bus_info);
21         printf("version:\t%d\n",cap.version);
22         printf("capabilities:\t%x\n",cap.capabilities);
23 
24         /*其中capabilities: 4000001通過與各種宏位與,
25         可以獲得物理設備的功能屬性*/
26         if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == V4L2_CAP_VIDEO_CAPTURE)
27         {
28             printf("Device %s: supports capture.\n",FILE_VIDEO);
29         }
30 
31         if ((cap.capabilities & V4L2_CAP_STREAMING) == V4L2_CAP_STREAMING)
32         {
33             printf("Device %s: supports streaming.\n",FILE_VIDEO);
34         }
35     } //VIDIOC_QUERYCAP對應唯一結構體

3、V4L2測驗(640×480像素一幀圖片輸出)

  我板載上裝的是Logitch c270攝像頭,從攝像頭支持的影像像素輸出的資訊可以看出,在Hi3559板載上可以支持2種像素格式,這里選用的是V4L2_PIX_FMT_YUV422 格式,從生成image的大小可以判斷出是正確的(YUV422資料大小 = 長 * 寬 * 1.5 = 640 * 480 * 2 = 614400 bytes = 600k)可以將image檔案拷出來,使用pYUV 軟體查看YUV圖片,這里需要注意,使用pYUV 查看YUV圖片的時候,需要正確設定圖片格式,按我上面代碼采集的資料格式,最后一幀圖片輸出結果如下:

  之后隨筆將推出結合MPP平臺實作視頻流的輸出,

 問題:

 

  在虛擬機上,腳本運行正常,但是會卡在視頻采集處,個人認為是虛擬機的快取問題,而板載快取比較充足,所以能夠很好實作,

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/259950.html

標籤:其他

上一篇:QT使用COM介面,如何跳轉到PPT的指定頁

下一篇:Hi3559AV100外接UVC/MJPEG相機實時采圖設計(二):V4L2介面的實作(以YUV422為例)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more