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


    项目-基于视频压缩的实时监控系统--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
    ");
            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.1.3事件处理函数void cam_Handler( int fd, void *arg )

          将图像的首地址赋值给

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

    struct tcp_srv
    {
     int sock;
    };

    struct tcp_cli
    {
     int sock;
     char *buf;
     int len;
     struct sockaddr_in addr;
     struct event_ext *ev_rx;
     struct event_ext *ev_tx;

     unsigned char req[FRAME_MAX_SZ];
     unsigned char rsp[FRAME_MAX_SZ+VID_FRAME_MAX_SZ];
    };

      

       

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

        

  • 相关阅读:
    sum left join 多次引发的问题
    WPF之Binding基础三 Binding的路径Path
    解决Android Studio启动不了的办法
    指向常量的指针和常量指针的区别简单理解
    简单的字符串操作
    QT问答
    log4qt使用示例
    在线代码库
    Qt5的windows开放环境准备
    QT 调试技术
  • 原文地址:https://www.cnblogs.com/ynxf/p/5732156.html
Copyright © 2020-2023  润新知