linux v4l2 攝像頭採集視訊的方法
Linux上用v4l2函式介面獲取視訊主要是一個步驟流程,一步步做就很容易,現已我在qt下編寫的一個讀取攝像頭視訊的程式中的相關程式碼為例。
首先開啟視訊裝置,比如/dev/video0,
- fd = open(dev_name.toStdString().c_str(), O_RDWR/*|O_NONBLOCK*/, 0);
- if(-1 == fd)
- {
- emit display_error(tr("open: %1").arg(QString(strerror(errno))));
-
return -1;
- }
- v4l2_capability cap;
- v4l2_cropcap cropcap;
- v4l2_crop crop;
- v4l2_format fmt;
- if(-1 == ioctl(fd, VIDIOC_QUERYCAP, &cap))
- { //查詢裝置功能
- if(EINVAL == errno)
- {
- emit display_error(tr("%1 is no V4l2 device").arg(dev_name));
- }
-
else
- {
- emit display_error(tr("VIDIOC_QUERYCAP: %1").arg(QString(strerror(errno))));
- }
- return -1;
- }
- if(!(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE))
- { //視訊採集
- emit display_error(tr("%1 is no video capture device").arg(dev_name));
- return -1;
- }
-
if
- { //視訊流
- emit display_error(tr("%1 does not support streaming i/o").arg(dev_name));
- return -1;
- }
- CLEAR(cropcap);
- cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- if(0 == ioctl(fd, VIDIOC_CROPCAP, &cropcap))
- {
- CLEAR(crop);
- crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- crop.c = cropcap.defrect;
- if(-1 == ioctl(fd, VIDIOC_S_CROP, &crop))
- {
- if(EINVAL == errno)
- {
- emit display_error(tr("VIDIOC_S_CROP not supported"));
- }
- else
- {
- emit display_error(tr("VIDIOC_S_CROP: %1").arg(QString(strerror(errno))));
- return -1;
- }
- }
- }
- else
- {
- emit display_error(tr("VIDIOC_CROPCAP: %1").arg(QString(strerror(errno))));
- return -1;
- }
- CLEAR(fmt);
- fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- fmt.fmt.pix.width = 640;
- fmt.fmt.pix.height = 480;
- fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;//YUV4:2:2
- fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;//隔行掃描
- if(-1 == ioctl(fd, VIDIOC_S_FMT, &fmt))
- { //設定視訊格式
- emit display_error(tr("VIDIOC_S_FMT").arg(QString(strerror(errno))));
- return -1;
- }
- if(-1 == init_mmap())
- { //初始化mmap,記憶體對映
- return -1;
- }
- v4l2_requestbuffers req;
- CLEAR(req);
- req.count = 4;
- req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- req.memory = V4L2_MEMORY_MMAP;
- if(-1 == ioctl(fd, VIDIOC_REQBUFS, &req))
- { //請求buf
- if(EINVAL == errno)
- {
- emit display_error(tr("%1 does not support memory mapping").arg(dev_name));
- return -1;
- }
- else
- {
- emit display_error(tr("VIDIOC_REQBUFS %1").arg(QString(strerror(errno))));
- return -1;
- }
- }
- if(req.count < 2)
- {
- emit display_error(tr("Insufficient buffer memory on %1").arg(dev_name));
- return -1;
- }
- buffers = (buffer*)calloc(req.count, sizeof(*buffers));//分配記憶體大小
- if(!buffers)
- {
- emit display_error(tr("out of memory"));
- return -1;
- }
- for(n_buffers = 0; n_buffers < req.count; ++n_buffers)
- {
- v4l2_buffer buf;
- CLEAR(buf);
- buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
- buf.memory = V4L2_MEMORY_MMAP;
- buf.index = n_buffers;
- if(-1 == ioctl(fd, VIDIOC_QUERYBUF, &buf))
- { //獲取buf資訊起始位置,長度等
- emit display_error(tr("VIDIOC_QUERYBUF: %1").arg(QString(strerror(errno))));
- return -1;
- }
- buffers[n_buffers].length = buf.length;
- buffers[n_buffers].start =
- mmap(NULL, // start anywhere
- buf.length,
- PROT_READ | PROT_WRITE,
- MAP_SHARED,
- fd, buf.m.offset);//對映
- if(MAP_FAILED == buffers[n_buffers].start)
- {
- emit display_error(tr("mmap %1").arg(QString(strerror(errno))));
- return -1;
- }
- }
- int VideoDevice::start_capturing()
-
相關推薦
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語言高階應用---操作linux下V4L2攝像頭應用程式
#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: