1. 程式人生 > 實用技巧 >基於視訊壓縮的實時監控系統-sprint2採集端影象採集子系統設計

基於視訊壓縮的實時監控系統-sprint2採集端影象採集子系統設計

(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);  //開啟攝像頭裝置檔案
    
//1.1 獲取驅動資訊 ioctl(v->fd, VIDIOC_QUERYCAP, &cap); //1.2 設定影象格式 ioctl(v->fd, VIDIOC_S_FMT, &fmt); //1.3 申請影象緩衝區 v->buf = calloc(req.count, sizeof(struct buf)); //1.4 把核心空間中的影象緩衝區對映到使用者空間 ioctl(v->fd, VIDIOC_QUERYBUF, &buf); //1.5 影象緩衝入隊 ioctl(v->fd, VIDIOC_QBUF, &buf);
//2、註冊事件到epoll v->ev = epoll_event_create(v->fd, EPOLLIN, cam_handler, v);//建立epoll附加結構 epoll_add_event(srv_main->epfd, v->ev);//新增事件到epoll }

//事件處理函式
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); }