项目-基于视频压缩的实时监控系统--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[]; //设备名称
__u8 drv[]; //驱动名称
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 -;
}
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.等待事件发生且处理。
项目-基于视频压缩的实时监控系统--tiny6410的更多相关文章
- 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计
回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...
- \阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint2-采集端图像采集子系统设计
1.在编写程序前有一个流程,思维导图: 初始化:包括初始化摄像头:注册事件到epoll 然后是开始启动采集:一旦开始采集我们的摄像头就会有数据了,它会触发事件处理函数:我们在这里的处理是保存这个图像: ...
- 基于视频压缩的实时监控系统-sprint1基于epoll架构的采集端程序设计
part1:产品功能 part2:epoll机制 select与epoll区别 1.select与epoll没有太大的区别.除了select有文件描述符限制(1024个),select每次调用都需 ...
- 基于视频压缩的实时监控系统-sprint2采集端图像采集子系统设计
(1).初始化:a.初始化摄像头:b.注册事件到epoll (2).开始采集--->触发事件处理系统 (3).保存图像(方便测试) a.初始化摄像头 //初始化摄像头 1.获取驱动信息 2.设置 ...
- 基于视频压缩的实时监控系统-sprint3采集端传输子系统设计
由于jpg本来就是编码压缩后的格式,所有无需重复编码 传输子系统步骤:(1)初始化:a.socket(初始化tcp连接):b.将事件添加到epoll中 (2)事件处理:接收到网络包.发送完网络包 st ...
- 转: 透过CAT,来看分布式实时监控系统的设计与实现
评注: 开源的分布式监控系统 转:http://www.infoq.com/cn/articles/distributed-real-time-monitoring-and-control-syste ...
- 透过CAT,来看分布式实时监控系统的设计与实现
2011年底,我加入大众点评网,出于很偶然的机会,决定开发CAT,为各个业务线打造分布式实时监控系统,CAT的核心概念源自eBay闭源系统CAL----eBay的几大法宝之一. 在当今互联网时代,业务 ...
- 嵌入式应用开发第四阶段-基于rk3399的视频监控系统
一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...
- lite-monitor 一款基于shell命令的监控系统
介绍 lite-monitor 一款基于shell命令的监控系统,可以根据项目中输出的日志定时输出或者统计输出,并发送钉钉机器人报警消息. lite-monitor能做什么: 定时监控某个服务进程是否 ...
随机推荐
- PHP美元符和花括号组合那些事—${${}}
双美元符+{}:${${variable}}是一种比较常见的用法,但是它的实现原理是什么呢?今天来探究一下: 提及这种用法,还得先说一下PHP的String类型php.net上指出,一个字符串可以用4 ...
- CAML获取SharePoint文档库中除文件夹外所有文档
方法一: <QueryOptions> <ViewAttributes Scope="Recursive" /> </QueryOptions> ...
- MySQL sharding的几个参考地址
http://stackoverflow.com/questions/5541421/mysql-sharding-approaches http://www.oschina.net/search?s ...
- OC中的面向对象语法3
一. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员的访问(类似机场的安检.水龙头过滤,过滤掉不合理的东西 ...
- sublime text 3 常用快捷键 、常用插件
常用快捷键 查找( Ctrl + P ) 找到任何东西 - :+行号 定位到具体的行 - @+符号 js的函数名, css的选择器名 - #+关键字 定位到特定的关键字 命令面板 (Ctrl ...
- Jexus-5.6.3使用详解、Jexus Web Server配置
一.Jexus Web Server配置 在 jexus 的工作文件夹中(一般是“/usr/jexus”)有一个基本的配置文件,文件名是“jws.conf”. jws.conf 中至少有 Site ...
- MVC中使用SignaIR入门教程
一.前言:每次写总要说一点最近的感想 进入工作快半年了,昨天是最郁闷的一天,我怀疑我是不是得了"星期一综合征",每个星期一很没有状态.全身都有点酸痛,这个可能一个星期只有周末才打一 ...
- AngularJS 简介
AngularJS 是一个 JavaScript 框架. 它可通过 <script> 标签添加到 HTML 页面. <script src="http://apps.bdi ...
- Java内存泄露简述
Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简单,内存泄露还是经常会在Java应用程序中出现. 本篇 ...
- java获取客户端ID地址
转:http://zhenchengchagangzi.iteye.com/blog/1199300#bc2372048 在JSP里,获取客户端的IP地址的方法是:request.getRemoteA ...