这篇文章将主要结合源码介绍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: 模型的统计信息

    /*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-201 ...

  2. java_String、StringBuilder

    在介绍String和StringBuilder前先学习一下equals方法和toString方法.API java1.6提取码:04b6 equals方法 equals方法,用于比较两个对象是否相同, ...

  3. VMware安装CentOS7教程

    首先安装VM,VM破解版和激活版的百度有很多,随意下载一个 下载CentOS7 地址1:https://mirrors.btte.net/centos/7/isos/x86_64/ 地址2:http: ...

  4. Bzoj4710 分特产(容斥原理+组合数)

    题面 Bzoj 题解 考虑容斥原理,所有人都有特产的方案数等于: 至少零个人没有特产\(-\)至少一个人没有特产\(+\)至少两个人有特产\(-...\) 接着考虑其中一种情况怎么求(假设现在至少有\ ...

  5. 【AI in 美团】深度学习在OCR中的应用

    AI(人工智能)技术已经广泛应用于美团的众多业务,从美团App到大众点评App,从外卖到打车出行,从旅游到婚庆亲子,美团数百名最优秀的算法工程师正致力于将AI技术应用于搜索.推荐.广告.风控.智能调度 ...

  6. Navicat Premium 激活码 序列号。破解版。

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha Navicat Premium 激活码  序列号.破解版.

  7. 4040 EZ系列之奖金

    4040 EZ系列之奖金 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond   题目描述 Description 由于无敌的WRN在2015年世界英俊帅气男总决选中 ...

  8. [UVa10296]Jogging Trails

    题目大意: 中国邮递员问题. 给你一个无向带权连通图,求经过所有边并返回起点的最短路径. 思路: Edmonds-Johnson算法. 显然,当原图为欧拉图时,答案即为其欧拉回路的长度. 考虑原图不存 ...

  9. 批量将Java源代码文件的编码从GBK转为UTF-8

    主要参考: http://blog.csdn.net/liu_qiqi/article/details/38706497 使用common io批量将java编码从GBK转UTF-8 http://w ...

  10. 【2017多校训练08 1002】【HDOJ 6134】Battlestation Operational

    典型的数列反演题. 运用莫比乌斯反演的一个结论 $[n = 1] = \sum_{d | n} \mu(d)$,将表达式做如下转化: $$ ans = \sum_{i=1}^n \sum_{j=1}^ ...