码迷,mamicode.com
首页 > 其他好文 > 详细

项目-基于视频压缩的实时监控系统--tiny6410

时间:2016-08-03 11:55:49      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:

项目-基于视频压缩的实时监控系统--tiny6410

@国嵌linux学习笔记。

  1. 构造服务端结构体 server

struct server
{
    int epfd;            //保存epoll指针
    struct cam *cam;        //采集子系统
    struct tcp_srv *srv;    //传输子系统
    struct cfg *cfg;        //配置子系统
};
struct server *srv_main;

  2.创建epoll,将返回值保存到srv_main->epfd

    

  3.让子系统自己添加事件,并将子系统的结构体指针保存到 srv_main 中。

    3.1 添加采集子系统 cam_sys_init();

    构造采集子系统结构

/*图像信息数据*/
struct buf
{
    void *start;    //图像起始地址
    int len;        //图像长度
};

/*摄像头数据*/
struct v4l2_dev
{
    int fd;        //保存设备文件的指针
    __u8 name[32];        //设备名称
    __u8 drv[16];        //驱动名称
    struct buf *buf;    
    struct event_ext *ev;
    struct cam *arg;
};

struct cam
{
    struct v4l2_dev *v4l2_dev;    //摄像头设备
    struct buf tran_frm;        //图像数据
    __u32 tran_frm_max_size;    //最大图像数据长度
};

      3.1.1初始化摄像头v4l2_init();

        3.1.1.1 打开设备文件        

v->fd = open("/dev/video2",O_RDWR|O_NONBLOCK);

 

        3.1.1.2获取驱动信息  

  ioctl( v->fd, VIDIOC_QUERYCAP, &cap);

    if( !(cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) )
    {
        printf("this is not a video device\n");
        return -1;    
    }
    strcpy((char *)v->name,(char *)cap.card);
    strcpy((char *)v->drv,(char *)cap.driver);

        3.1.1.3设置图像格式 

     fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	fmt.fmt.pix.width = 320;
	fmt.fmt.pix.height = 240;
	fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
	fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
	ioctl( v->fd, VIDIOC_S_FMT, &fmt );

        3.1.1.4申请图像缓存区  

 

     req.count = 4;
	req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
	req.memory = V4L2_MEMORY_MMAP;
	ioctl( v->fd, VIDIOC_REQBUFS, &req );

        3.1.1.5把内核空间映射到用户空间

 

     v->buf = calloc( 4, sizeof(struct buf) );
	for( i=0; i<req.count; i++ )
	{
		buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
		buf.memory = V4L2_MEMORY_MMAP;
		buf.index = i;
		
		ioctl( v->fd, VIDIOC_QUERYBUF, &buf );

		v->buf[i].len = buf.length;

		v->buf[i].start = mmap( NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, v->fd,buf.m.offset);
	}

 

      3.1.1.6图像缓存入队

 

     for( i=0; i<4; i++ )
	{
		buf.type	=	V4L2_BUF_TYPE_VIDEO_CAPTURE;
		buf.memory	=	V4L2_MEMORY_MMAP;
		buf.index	=	i;
		ioctl( v->fd, VIDIOC_QBUF, &buf );
	}

 

  

 

      3.1.2将采集子系统的事件加入到epoll池

      v4l2_start_capture( cam->v4l2_dev );  

   

    3.2添加传输子系统net_sys_init();

          

  4.等待事件发生且处理。

    

 

项目-基于视频压缩的实时监控系统--tiny6410

标签:

原文地址:http://www.cnblogs.com/ynxf/p/5732156.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!