1. 程式人生 > >linux v4l2 攝像頭採集視訊的方法

linux v4l2 攝像頭採集視訊的方法

Linux上用v4l2函式介面獲取視訊主要是一個步驟流程,一步步做就很容易,現已我在qt下編寫的一個讀取攝像頭視訊的程式中的相關程式碼為例。

首先開啟視訊裝置,比如/dev/video0,

  1. fd = open(dev_name.toStdString().c_str(), O_RDWR/*|O_NONBLOCK*/, 0);  
  2.     if(-1 == fd)  
  3.     {  
  4.         emit display_error(tr("open: %1").arg(QString(strerror(errno))));  
  5.         return -1;  
  6.     }  
然後初始化裝置
  1. v4l2_capability cap;  
  2. v4l2_cropcap cropcap;  
  3. v4l2_crop crop;  
  4. v4l2_format fmt;  
  5. if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))  
  6. {   //查詢裝置功能
  7.     if(EINVAL == errno)  
  8.     {  
  9.         emit display_error(tr("%1 is no V4l2 device").arg(dev_name));  
  10.     }  
  11.     else
  12.     {  
  13.         emit display_error(tr("VIDIOC_QUERYCAP: %1").arg(QString(strerror(errno))));  
  14.     }  
  15.     return -1;  
  16. }  
  17. if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))  
  18. {   //視訊採集
  19.     emit display_error(tr("%1 is no video capture device").arg(dev_name));  
  20.     return -1;  
  21. }  
  22. if
    (!(cap.capabilities & V4L2_CAP_STREAMING))  
  23. {   //視訊流
  24.     emit display_error(tr("%1 does not support streaming i/o").arg(dev_name));  
  25.     return -1;  
  26. }  
  27. CLEAR(cropcap);  
  28. cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  29. if(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))  
  30. {  
  31.     CLEAR(crop);  
  32.     crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  33.     crop.c = cropcap.defrect;  
  34.     if(-1 == ioctl(fd, VIDIOC_S_CROP, &crop))  
  35.     {  
  36.         if(EINVAL == errno)  
  37.         {  
  38.             emit display_error(tr("VIDIOC_S_CROP not supported"));  
  39.         }  
  40.         else
  41.         {  
  42.             emit display_error(tr("VIDIOC_S_CROP: %1").arg(QString(strerror(errno))));  
  43.             return -1;  
  44.         }  
  45.     }  
  46. }  
  47. else
  48. {  
  49.     emit display_error(tr("VIDIOC_CROPCAP: %1").arg(QString(strerror(errno))));  
  50.     return -1;  
  51. }  
  52. CLEAR(fmt);  
  53. fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  54. fmt.fmt.pix.width = 640;  
  55. fmt.fmt.pix.height = 480;  
  56. fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//YUV4:2:2
  57. fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;//隔行掃描
  58. if(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt))  
  59. {  //設定視訊格式
  60.     emit display_error(tr("VIDIOC_S_FMT").arg(QString(strerror(errno))));  
  61.     return -1;  
  62. }  
  63. if(-1 == init_mmap())  
  64. {  //初始化mmap,記憶體對映
  65.     return -1;  
  66. }  
初始化mmap   
  1. v4l2_requestbuffers req;  
  2. CLEAR(req);  
  3. req.count = 4;  
  4. req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  5. req.memory = V4L2_MEMORY_MMAP;  
  6. if(-1 == ioctl(fd, VIDIOC_REQBUFS, &req))  
  7. {   //請求buf
  8.     if(EINVAL == errno)  
  9.     {  
  10.         emit display_error(tr("%1 does not support memory mapping").arg(dev_name));  
  11.         return -1;  
  12.     }  
  13.     else
  14.     {  
  15.         emit display_error(tr("VIDIOC_REQBUFS %1").arg(QString(strerror(errno))));  
  16.         return -1;  
  17.     }  
  18. }  
  19. if(req.count < 2)  
  20. {  
  21.     emit display_error(tr("Insufficient buffer memory on %1").arg(dev_name));  
  22.     return -1;  
  23. }  
  24. buffers = (buffer*)calloc(req.count, sizeof(*buffers));//分配記憶體大小
  25. if(!buffers)  
  26. {  
  27.     emit display_error(tr("out of memory"));  
  28.     return -1;  
  29. }  
  30. for(n_buffers = 0; n_buffers < req.count; ++n_buffers)  
  31. {  
  32.     v4l2_buffer buf;  
  33.     CLEAR(buf);  
  34.     buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;  
  35.     buf.memory = V4L2_MEMORY_MMAP;  
  36.     buf.index = n_buffers;  
  37.     if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))  
  38.     {   //獲取buf資訊起始位置,長度等
  39.         emit display_error(tr("VIDIOC_QUERYBUF: %1").arg(QString(strerror(errno))));  
  40.         return -1;  
  41.     }  
  42.     buffers[n_buffers].length = buf.length;  
  43.     buffers[n_buffers].start =  
  44.             mmap(NULL, // start anywhere
  45.                  buf.length,  
  46.                  PROT_READ | PROT_WRITE,  
  47.                  MAP_SHARED,  
  48.                  fd, buf.m.offset);//對映
  49.     if(MAP_FAILED == buffers[n_buffers].start)  
  50.     {  
  51.         emit display_error(tr("mmap %1").arg(QString(strerror(errno))));  
  52.         return -1;  
  53.     }  
  54. }  
開始捕獲視訊
  1. int VideoDevice::start_capturing()  
  2. 相關推薦

    linux v4l2 攝像頭採集視訊方法

    Linux上用v4l2函式介面獲取視訊主要是一個步驟流程,一步步做就很容易,現已我在qt下編寫的一個讀取攝像頭視訊的程式中的相關程式碼為例。 首先開啟視訊裝置,比如/dev/video0, fd = open(dev_name.toStdStr

    Linux V4L2 攝像頭視訊採集

    1. 開啟裝置檔案。 int fd=open(”/dev/video0″,O_RDWR);2. 取得裝置的capability,看看裝置具有什麼功能,比如是否具有視訊輸入,或者音訊輸入輸出等。VIDIOC_QUERYCAP,struct v4l2_capability3. 選擇視訊輸入,一個視訊裝置可以有多個

    使用GStreamer作v4l2攝像頭採集和輸出到YUV檔案及螢幕的相關測試

    環境:ubuntu 9.10  安裝軟體:gstreamer 基本包 以及gst-plug-ins-bad, mplayer 1、使用mplayer播放yuv檔案 [email protected]:~/yuv_play_test_from_hp$ mplayer

    Linux QT攝像頭採集影象

    Linux下使用各種裝置是一件令人興奮的事情。 在Unix的世界裡,使用者與硬體打交待總是簡單的。最近筆者在Linux下搞了攝像頭的開發,有一點感想發於此處。 Linux中操作一個裝置一般都是開啟(open),讀取(read)和關閉(close)。使用Read的大多是一些字元

    GStreamer資料(攝像頭採集,視訊儲存,遠端監控)DVR

    GStreamer資料整理(包括攝像頭採集,視訊儲存,遠端監控,流媒體RTP傳輸) 1,gstreamer開發手冊,gstreamer官網(這些都不用說了吧) 2,gst-launch的用法,這也不用說了吧。(白菜,雞蛋,西紅柿,磚頭,滑鼠……..) lqpla

    Linux下利用nginx流伺服器推送攝像頭實時採集視訊

    應用環境:伺服器:Ubuntu 14.04.5 (cat /etc/issue檢視)。 USB攝像頭:直插在Linux上。 ffmpeg -f video4linux2 -i /dev/video0 -f flv rtmp://192.168.1.200/live/live

    Linux V4L2採集YUV視訊並播放

    接著上一接部落格繼續寫。 採集YUV視訊很簡單,比採集bmp圖片更簡單,因為採集圖片還要考慮圖片格式,要做YUV到RGB的格式轉換等工作。而採集YUV視訊直接把採集的YUV資料丟進一個檔案裡就行了。 在上一篇部落格裡,修改一點點程式碼就可以完成採集YUV視訊

    Linux v4l2編程(攝像頭信息采集)

    dwr 數據格式 切換 logs 註意 vbs 實例 isp char 基於Linux3.4.2,自己做一點兒視頻信息采集及網絡傳輸的小實驗,邊做邊學,一些基礎知識同步整理。。。。。   1. 定義 V4L2(Video For Linux Two) 是內核提供給應用程序訪

    Android中直播視訊技術探究之---採集攝像頭Camera視訊源資料進行推流(採用金山雲SDK)

    一、前言在之前已經詳細介紹了Android中的一種視訊資料來源:Camera,不瞭解的同學可以點選進入:Android中Camera使用詳解 ,在這篇文章中我們介紹瞭如何採集攝像頭的每一幀資料,然後進行

    Zedboard & Zynq 影象採集(五) 板端Linux視訊TCP傳送 & Linux上位機QT視訊顯示

    前面幾篇已經陸續講述了影象採集,傳輸,Linux系統搭建等,這一篇就講一下自制一個簡單的板端視訊傳送和Linux上位機視訊顯示客戶端。板端視訊傳送用Zedboard做視訊資料傳輸,我能想到的是兩條路,一條就是網口,一條就是USB,USB傳輸方式打算以後研究一下,用網口是比較熟

    攝像頭Camera視訊源資料採集解析

    一、前言 在視訊直播中一般都是兩種視訊資料來源,一個是攝像頭資料,一個是錄製桌面資料,而一般來說美女妹子直播都是來自於攝像頭資料,遊戲直播都是錄製桌面資料的,那麼今天就來看看第一個資料來源資料採集分析,Android中使用攝像頭的場景很多,在沒有直播這個行業出

    Android攝像頭採集視訊資料流如何通過Socket實時傳送到目標服務端

    分兩塊: 1.取得攝像頭採集的視訊流 2.傳送到伺服器端 protected MediaRecorder mMediaRecorder; private LocalServerSocket mLss = null; private LocalSock

    opencv利用攝像頭抓取視訊方法-ubuntu

    #include "opencv/highgui.h" #include "opencv/cv.h" using namespace std; using namespace cv; int main(int argc, char** argv){ cvNamedWindow("testcamera",

    分享幾個Android攝像頭採集的YUV資料旋轉與映象翻轉的方法

    最近在做直播推流方面的工作,因為需要新增美白,濾鏡,AR貼圖等效果。所以不能簡單的使用SufaceView加Camera的方式進行資料的採集,而是需要對Camera採集到的YUV資料進行相關的處理之後然後再進行推流的操作,YUV資料的返回介面。@Override public

    C語言高階應用---操作linuxV4L2攝像頭應用程式

    #include "CameralOpt.h" int video_fd ; int length ; char *yuv[COUNT] ; struct v4l2_buffer enqueue , dequeue ; //定義出入隊的操作結構體成員 int Init_Cameral(int

    opencv採集視訊/攝像頭資料並儲存

    純粹是自娛自樂,並沒有對opencv的使用進行深入的學習,用opencv開啟視訊檔案或者開啟攝像頭採集,然後儲存,這也是最基礎的東西。 一、安裝配置環境                                                            

    Linux攝像頭 V4L2曝光時間控制

    設定曝光值的通常流程是: 1. 首先將曝光模式修改為手動曝光。 2. 設定曝光檔次或者具體的曝光值。 例1:得到曝光模式,設定為手動曝光模式 int ret; struct v4l2_control ctrl; //得到曝光模式 ctrl.id = V4L2_C

    linux缺失gcc的安裝方法

    sta baseurl 方法 /dev/ dha .com 安裝 沒有 ima linux安裝gcc操作 1.查看linux是否有gcc文件 這個是沒有掛載的 2. 使用df,查看系統光盤的掛載位置 3.卸載分區 umount /dev/sr0 4.將redhat

    Kali Linux 上安裝Nessus的方法

    kali nessus安裝 Nessus是系統漏洞掃描與分析軟件,但Nessus在Kali Linux上的安裝可不簡單,沒有提供一個圖形化的安裝借口,下面就給大家介紹下如何在Kali Linux上安裝Nessus。利用Iceweasel 打開http://www.tenable.com/product

    Linux下Java調試方法

    java linux 參數 調試 jdb 1、如何開啟一個Java進程的調試選項?替換原有java程序:mv /usr/bin/java /usr/bin/java_true在/usr/bin/目錄下生成一個java文件,其內容如下:java_true -Xdebug -Xrunjdwp: