这篇文章将主要结合源码介绍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. PHP 数组的添加和读取

    在实际的开发中,会经常使用数组的添加和读取.这里把经常使用的操作记下来,以备以后查阅. <?php //一维数值数组 $list = array('wang','god'); $list[] = ...

  2. 深入理解SQL的四种连接,左外连接,右外连接,内连接,全连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 stude ...

  3. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  4. 内核启动文件系统后第一个执行的文件(inittab启动脚本分析)

    Linux 开机脚本启动顺序: 第一步:启动内核 第二步:执行init (配置文件/etc/inittab) 第三步:启动相应的脚本,执行inittab脚本,并且执行里面的脚本/etc/init.d ...

  5. Replication Controller

    RC保证在同一时间能够运行指定数量的Pod副本,保证Pod总是可用.如果实际Pod数量比指定的多就结束掉多余的,如果实际数量比指定的少就启动缺少的. 当Pod失败.被删除或被终结时,RC会自动创建新的 ...

  6. 怎么处理stdClass::__set_state

    处理后 处理方法 function object2array_pre(&$object) { if (is_object($object)) { $arr = (array)($object) ...

  7. BZOJ 2959: 长跑 lct 双联通分量 并查集 splay

    http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...

  8. SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

    Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...

  9. 【对比分析二】Web Storage和cookie的区别

    1)  存储空间不同. a)  Web Storage能提供5MB的存储空间(不同浏览器的提供的空间不同).Cookie仅4KB. b)  Web Storage每个域(包括子域)有独立的存储空间,各 ...

  10. sql server 游标continue,总是死循环

    也遇上过:   死循环是因为continue后又执行与上次相同的fetch了.在continue前加一个fetch next from就可以了.