这篇文章将主要结合源码介绍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)的更多相关文章

  1. 远程视频监控之驱动篇(LED)

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515205 之前一直在考虑该不该写这篇,由于我之前在博客里有写过LED的驱动 ...

  2. Python远程视频监控

    Python远程视频监控程序   老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...

  3. 如何利用SimpleNVR建立全天候远程视频监控系统

    随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...

  4. 基于Android的远程视频监控系统(含源码)

    基本过程是android作为socket客户端将采集到的每一帧图像数据发送出去,PC作为服务器接收并显示每一帧图像实现远程监控.图片如下(后来PC端加了个拍照功能)... (PS.刚学android和 ...

  5. H.264远程视频监控系统

    由usb摄像头驱动,h264编码库,采集read_video,传输,客户端显示组成 读取摄像头数据缓冲区是否有帧数据收到,有数据收到就读取数据并进行H264编码,把数据发送到socket发送到客户端. ...

  6. Flex 远程视频监控观看端新版

    第一个版本号仅仅做了预览这一块 http://blog.csdn.net/songanling/article/details/38306037,后面老板看了认为色调太暗.看得不舒服,然后就開始又一次 ...

  7. 嵌入式应用开发第四阶段-基于rk3399的视频监控系统

    一.需求分析 伴随着嵌入式技术.图像处理技术和无线网络传输技术的发展,传统模拟视频监控系统和基于PC的远程视频监控系统由于自身的不足,已经无法满足现代社会应用中不断涌现出来的新需求,于是基于嵌入式技术 ...

  8. C# 视频监控系列:学习地址汇总

    原文地址:http://www.cnblogs.com/over140/archive/2009/04/07/1429308.html 前言 对于视频监控系统大家应该是不陌生的,实施的路况信息.地铁. ...

  9. 【树莓派+.NET MF打造视频监控智能车】控制篇(树莓派)

    对已经具备一定Linux基础的人来说,树莓派学习起来应该非常简单自然.在他们眼中,树莓派就是一个简易版的,卡通版的Linux而已.但是对我这样一个早已习惯微软技术生态系统的人或者初学者来说,要实现一个 ...

随机推荐

  1. Python爬虫个人记录(二) 获取fishc 课件下载链接

    参考: Python爬虫个人记录(一)豆瓣250 (2017.9.6更新,通过cookie模拟登陆方法,已成功实现下载文件功能!!) 一.目的分析 获取http://bbs.fishc.com/for ...

  2. javacript 实现两个数组的差集

    <script type="text/javascript">      var array1 = [1,2,3,4,5,6,7,8,9];      var arra ...

  3. 20172304 实验二 《Java面向对象程序设计》 实验报告

    20172304 实验二 <Java面向对象程序设计> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:段志轩 学生学号:20172304 实验时间 ...

  4. Mybatis框架简单使用

    Mybatis框架简单使用 环境搭建 新建一个JavaWeb项目,在web\WEB-INF\创建lib文件,并且在其下添加Mybatis的核心包以及依赖包,以及Mysql驱动包,junit4测试包等. ...

  5. python流行的原因

    12~14年是云计算最火的几年,大批创业公司和巨头挤破头地进军云计算领域,大家都在做IAAS,最著名的云计算开源平台OpenStack 就是基于Python 开发的,为此催生出不少Python 岗位 ...

  6. android 定时, 延时 任务

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 倒计时类  用  倒计时定时器CountDownTimer 延迟类 CountDownT ...

  7. luoguP3507 [POI2010]GRA 性质 + 动态规划

    题目大意: 给定\(n\)个正整数,\(a, b\)两个人轮流取,\(a\)先手 每次可以取任意多的数,直到取完,每次的得分为取的数中的最小值 \(a, b\)都会使自己的得分减去对手的得分更大,询问 ...

  8. Android中Service与IntentService的使用比较

    不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentServic ...

  9. Problem H: 深入浅出学算法009-韩信点兵

    Description 秦朝末年,楚汉相争.有一次,韩信将1500名将士与楚王大将李锋交战.苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是,韩信整顿兵马也返回大本营.当行至一山坡,忽有后军来报 ...

  10. BZOJ5137[Usaco2017 Dec]Standing Out from the Herd

    看了半天题 不知道怎么用SAM维护 于是借(chao)鉴(xi)的一发神犇的 只要判断这个子串之前被标记的记号(也就是他属于第几个串)和这次转移到的是否相同 如果不同就说明该子串属于多个串 直接标记- ...