基於視訊壓縮的實時監控系統-sprint2採集端影象採集子系統設計
阿新 • • 發佈:2020-08-04
(1)、初始化:a.初始化攝像頭;b.註冊事件到epoll
(2)、開始採集--->觸發事件處理系統
(3)、儲存影象(方便測試)
a.初始化攝像頭 | //初始化攝像頭 |
1、獲取驅動資訊 2、設定影象格式 3、申請影象緩衝區 4、對映到使用者空間 5、影象緩衝入佇列 |
//初始化攝像頭 struct v4l2_dev* v4l2_init() { //1、初始化攝像頭 v = calloc(1, sizeof(struct v4l2_dev)); v->fd = open("/dev/video3", O_RDWR | O_NONBLOCK, 0); //開啟攝像頭裝置檔案 |
//事件處理函式 void cam_handler(int fd, void* arg) { struct v4l2_buffer buf; struct v4l2_dev* v = arg; int file_fd; file_fd = open("test.jpg", O_RDWR | O_CREAT, 0777); /*幀出列*/ buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; //V4L2_BUF_TYPE_VIDEO_CAPTURE:1 buf.memory = V4L2_MEMORY_MMAP; ioctl(v->fd, VIDIOC_DQBUF, &buf); write(file_fd, v->buf[buf.index].start, v->buf[buf.index].len); close(file_fd); /*buf入列*/ ioctl(v->fd, VIDIOC_QBUF, &buf); } void v4l2_start_capture(struct v4l2_dev* v) { enum v4l2_buf_type type; type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(v->fd, VIDIOC_STREAMON, &type); } struct cam* cam_sys_init() { struct cam* cam = calloc(1, sizeof(struct cam)); //1、初始化 cam->v4_dev = v4l2_init(); //2、開始採集 v4l2_start_capture(cam->v4_dev); }