项目-基于视频压缩的实时监控系统--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能做什么: 定时监控某个服务进程是否 ...
随机推荐
- 关于Canvas模糊的问题
前言:当我在几个多月前,第一次在移动设备上使用canvas绘制内容的时候,我惊然地发现我绘制的图片以及文字居然都是模糊的!我的内心几乎是崩溃的,因为那是我第一个使用canvas的项目,是一个基于微信端 ...
- sql联合查询
联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码) userid int username varchar(20) password ...
- 完美解决AutoCAD2012,AutoCAD2013本身电脑里有NET4.0或以上版本却装不上的问题
适用情况:电脑里本身有NET4.0或4.5版本,并且正确安装.或本身你就装有AutoCAD2013或AutoCAD2012要装AutoCAD2012或AutoCAD2013却装不上的情况 如图1所示. ...
- ArcGisServer根据最大最小坐标换算瓦片行列号
1.前言 在上一节中我们知道了屏幕上一像素等于实际中多少单位长度(米或经纬度)的换算方法,而知道这个原理后,接下来我们要怎么用它呢?它和我们前端显示地图有什么关联呢?这一节,我会尽量详细的将这两个问题 ...
- MyEclipse 2015免费在线公开课,2月5日开讲
MyEclipse 2015免费在线公开课,2月5日开讲,由MyEclipse官方高级PM Brian Fernandes 主讲. 主讲内容: 更好地支持javascript和技术模块 全新的REST ...
- Xcode8以及iOS10问题总结!
Xcode8的问题 注释功能问题解决 打开终端,命令运行: sudo /usr/libexec/xpccachectl 重启电脑 在xib和stroyboard出现大量警告,需要重新适配,字体所占用宽 ...
- Eclipse为成员变量设置前缀
Eclipse可以自动生成getter和setter,constructor. 菜单 - Source, 有Generate Getters and Setter,Generate Construct ...
- 【Android】HorizontalScrollView内子控件横向拖拽
前言 网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下. 声明 欢迎转载,但请保留文章原始出处:) 博客园 ...
- SQL速记
集合操作 WITH a AS ( SELECT 1 id UNION SELECT 2 ), b AS ( SELECT 1 id UNION SELECT 3 ) SELECT * FR ...
- 【转】探索C#之布隆过滤器(Bloom filter)
原文:蘑菇先生,http://www.cnblogs.com/mushroom/p/4556801.html 背景介绍 Bloom filter(后面简称BF)是Bloom在1970年提出的二进制向量 ...