这篇文章将主要结合源码介绍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. 关于ueditor的使用心得

    http://blog.csdn.net/baronyang/article/details/45640181 1.取编辑器内的内容: <span style="font-size:1 ...

  2. bs和cs

    CS(Client/Server):客户端----服务器结构.C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.因为客户端要负责绝大多数 ...

  3. JIT即时编译器

    一.什么是JIT? 即时编译器,负责将IL转换成本机CPU指令 二.JIT编译原理 ①在Main方法执行之前,CLR会检测出Main的代码引用的所有类型.会导致CLR分配一个内部结构.在这个结构中,C ...

  4. OpenStack Keystone V3 简介

    Keystone V3 简介 Keystone 中主要涉及到如下几个概念:User.Tenant.Role.Token.下面对这几个概念进行简要说明. User:顾名思义就是使用服务的用户,可以是人. ...

  5. ubuntu16.04服务器apache的ssl证书配置

    背景:在腾讯云申请的免费证书1年,服务器ubuntu 16.04版本,我的是多域名 1.ssl模块的安装 sudo a2enmod ssl //开启apache ssl模块 a2ensite defa ...

  6. java集合之一(框架介绍)

    本文转载自:http://www.cnblogs.com/skywang12345/p/3308498.html Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(It ...

  7. [COGS 2066]七十与十七

    http://218.28.19.228/cogs/problem/problem.php?pid=2066 [题目描述] 七十君最近爱上了排序算法,于是Ta让十七君给Ta讲冒泡排序. 十七君给七十君 ...

  8. VC 操作 EXCEL---插入工作表(Insert.Sheet)方法

    看到的资料 http://bbs.csdn.net/topics/198565 自己总结一下 //插入到nIndex工作表之前 void InsertSheet(int nIndex) { sheet ...

  9. Codeforces Round #228 (Div. 1) B. Fox and Minimal path 构造

    B. Fox and Minimal path 题目连接: http://codeforces.com/contest/388/problem/B Description Fox Ciel wants ...

  10. SQL2008″Unable to read the list of previously registered servers on this system”

    打开SQL2008,弹出”Unable to read the list of previously registered servers on this system”错误, 微软官方的解决方法:h ...