远程视频监控之应用篇(mjpg-streamer)
这篇文章将主要结合源码介绍mjpg-streamer,使小伙伴们了解视频监控的实现。
一.移植
tar xvf mjpg-streamer-r63.tar.gz
cd mjpg-streamer-r63
修改所有的Makefile
--(1) 将 CC=gcc 修改为 CC=arm-linux-gcc
--(2) 修改plugins/input_uvc/Makfile
a. 将
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
改为
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include
注意:
-I /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include // 是编译libjpeg 生成的文件
b. 将
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo
jpeg_utils.lo dynctrl.lo
改为
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -ljpeg -L
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib -o $@
input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
make
cp mjpg_streamer 靠别到开发板的/bin目录
cp *so* 拷贝到开发板的/lib
二.软件结构
软件MJPG-streamer采用模块化的设计方法,以功能块为单位进行描述,这些功能块被称为plug-in(组件)。软件中定义好了各组件的输入、输出,以及组件之间的衔接关系。用户可自行根据对功能的需求,选择需要的模块。这种模块化的程序设计简化了代码的编写、调试、维护,程序员只需要遵守设计的规范,就可以轻松地改写软件,或者编写新的模块以增强软件的功能。
input_uvc <----------------------- ------------------------> output_autofocus
input_file <-------------------- MJPG-streamer --------------------> output_file
input_testpicture
<--------------------
input_gspcav <----------------------- ------------------------> output_http
我们选择的组件是input_uvc (输入USB摄像头数据)和output_http(输出网页),output_file(输出图片)
三.初始化
从mjpg_streamer.c文件开始分析
1.输入初始化(input_init();)
global.in.init(&global.in.param) //打开input_init()函数
input_init() //input_uvc.c
1.识别参数
2.调用init_videoIn() //设置结构体,调用init_v4l2,分配缓冲区(存放摄像头数据)
init_v4l2() //根据设置的参数,做相应的操作,这里是真正调用驱动的地方
2.输出初始化(output_init();)
global.out[i].init(&global.out[i].param) //调用output_run();
output_init() //解析参数,相应变量赋值
四.运行
从mjpg_streamer.c文件开始分析
1.输入运行(input_run();)
global.in.run(); //调用input_run();
input_run()
pthread_create(&cam, 0, cam_thread, NULL); //创建线程
void *cam_thread( void *arg )
uvcGrab(videoIn) //获得一帧数据
if (videoIn->formatIn == V4L2_PIX_FMT_YUYV) //如果YUV则压缩,否则直接拷贝buffer中
2.输出运行(output_run();)
global.out[i].run(global.out[i].param.id); //调用output_run();
output_run(int id)
pthread_create(&(servers[id].threadID), NULL, server_thread, &(servers[id])); //创建线程
void *server_thread( void *arg )
pthread_create(&client, NULL, &client_thread, pcfd)
void *client_thread( void *arg ) //客户端连接服务
_readline(lcfd.fd, &iobuf, buffer, sizeof(buffer)-1, 5)
_read(fd, iobuf, &c, 1, timeout)
read(fd, &iobuf->buffer, IO_BUFFER)) //读取数据
send_stream(lcfd.fd); //发送流
pthread_cond_wait(&pglobal->db_update, &pglobal->db);
//等待数据更新
memcpy(frame,
pglobal->buf, frame_size); //从buf中取出数据
write(fd, frame,
frame_size) //发出数据
五.命令参数
这个是我设置的参数:输入UVC,网页输出,图片输出(更详细的设置,建议去看源码)
mjpg_streamer -i "input_uvc.so
-f 10 -r 320*240 -y" -o "output_http.so -c "ruoyun:liufeng" -w www -p
8888" -o "output_file.so -d 1000 -f /mnt "
-i 输入
"input_uvc.so -f 10 -r 320*240 -y"
input_uvc.so:UVC输入组件
-f 10 :表示10帧
-r 320*240 :分辨率
-y
:YUV格式输入(有卡顿),不加表示MJPG输入(需要摄像头支持)
-o输出
"output_http.so -c "ruoyun:liufeng" -w www -p 8888"
output_http.so :网页输出组件
-c "ruoyun:liufeng" :用户名:ruoyun 密码:liufeng
-w www : 网页输出
-p 8888 :端口 8888
"output_file.so -d 1000 -f /mnt "
output_file.so :图片输出组件
-d 1000 : 时间1S
-f /mnt :输出图片放在哪,我是开机直接把/mnu挂载到本地文件夹了
远程视频监控之应用篇(mjpg-streamer)的更多相关文章
- 远程视频监控之驱动篇(LED)
转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515205 之前一直在考虑该不该写这篇,由于我之前在博客里有写过LED的驱动 ...
- Python远程视频监控
Python远程视频监控程序 老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...
- 如何利用SimpleNVR建立全天候远程视频监控系统
随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...
- 基于Android的远程视频监控系统(含源码)
基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...
- H.264远程视频监控系统
由usb摄像头驱动,h264编码库,采集read_video,传输,客户端显示组成 读取摄像头数据缓冲区是否有帧数据收到,有数据收到就读取数据并进行H264编码,把数据发送到socket发送到客户端. ...
- Flex 远程视频监控观看端新版
第一个版本号仅仅做了预览这一块 http://blog.csdn.net/songanling/article/details/38306037,后面老板看了认为色调太暗.看得不舒服,然后就開始又一次 ...
- 嵌入式应用开发第四阶段-基于rk3399的视频监控系统
一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...
- C# 视频监控系列:学习地址汇总
原文地址:http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html 前言 对于视频监控系统大家应该是不陌生的,实施的路况信息.地铁. ...
- 【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)
对已经具备一定Linux基础的人来说,树莓派学习起来应该非常简单自然.在他们眼中,树莓派就是一个简易版的,卡通版的Linux而已.但是对我这样一个早已习惯微软技术生态系统的人或者初学者来说,要实现一个 ...
随机推荐
- Android手机系统设置页面跳转
android.provider.Settings. 1. ACTION_ACCESSIBILITY_SETTINGS : // 跳转系统的辅助功能界面 Intent intent = ne ...
- TI科学家谈浮点DSP未来发展
自十多年前浮点数字信号处理器(DSP)诞生以来,便为实时信号处理提供了算术上更为先进的备选方案.不过,定点器件至今仍是业界的主流.当然低成本是主要原因.定点DSP每器件产品的价格很低,这对大规 ...
- shell 转码BIG5 UTF8
BIG-5 轉 UTF-8 若要將一個文字檔從 BIG-5 編碼轉換為 UTF-8 編碼,可以執行: iconv -f BIG-5 -t UTF-8 big5.txt > utf8.txt 其中 ...
- OI刷题记录(Updating)
[Counter] [AGC]:0/96 [ARC]:0/70 [2016年省选]:0/69 [2017年省选]:22/75 [2018年省选]:0/63 [ZROI2018]:0/30 [ZROI2 ...
- poj 1436 线段树
题意:给你N条线段(垂直于x轴)的两个y坐标还有x坐标,问相互看到的三元组有多少个.有点纠结就是,如果两个连线之间正好有一条线段的某个端点,这个也是不能计算的,所以这个端点就有意义了,所以就用上面那个 ...
- hdu 4462 第37届ACM/ICPC 杭州赛区 J题
题意:有一块n*n的田,田上有一些点可以放置稻草人,再给出一些稻草人,每个稻草人有其覆盖的距离ri,距离为曼哈顿距离,求要覆盖到所有的格子最少需要放置几个稻草人 由于稻草人数量很少,所以状态压缩枚举, ...
- zoj 3229 上下界网络最大可行流带输出方案
收获: 1. 上下界网络流求最大流步骤: 1) 建出无环无汇的网络,并看是否存在可行流 2) 如果存在,那么以原来的源汇跑一次最大流 3) 流量下界加上当前网络每条边的流量就是最大可行流了. 2. 输 ...
- http协议之 COOKIE
cookie我们都很了解,这里描述下cookie的几个参数意义 key = "qq", value = "Bobser" .. os.time(), path ...
- win7 64位安装pywin32
先安装pywin32-218.win-amd64-py3.4.exe文件: 安装完成后,用CMD管理员模式进入\Python34\Scripts\目录 输入pywin32_postinstall.py ...
- Python学习笔记(三):随机生成函数方法
本文是在Python2下总结! Python中的random模块用于生成随机数,如果想生成随机数需要先导入random的模块然后才能使用其中的方法,下面简单介绍一下常用的结果函数方法: 1·.rand ...