mjpg-streamer程框架图如下所示:

程序运行起来后,主进程根据传入的参数设置的输入输出通道打开对应的输入输出动态链接库,并依次调用以下函数

1、输入---仓库-----输出(mjpg-streamer.h)

(1)global结构体

stop为停止标志位,置1时程序停止运行;

db和db_update分别为互斥锁和条件变量,两者用于线程同步,当输入通道把数据放入仓库后,通知输出通道来取数据

仓库对应的是buf指针,仓库的大小是size.

输出对应的是output结构体(输出插件)

outcnt表示当前输出通道中有几种方式

(2)mjpg-streamer-r63文件

.so文件是插件,可能是输入插件(前面带有input字样),也可能是输出插件(前面带有output插件)。

运行mjpg_streamer时通过命令行mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"指定输入输出通道

由于用的是USB摄像头来采集数据,因此选择input_uvc.so输入插件作为输入渠道(如上所示,通过-i指定哪一个插件作为输入渠道)。

由于我们要用的是网页显示,因而选择output_http.so输出插件作为输出渠道。(如上图所示,通过-o选项指定哪一个插件作为输出渠道)

(3)主函数通过解析命令行-i "input_uvc.so -f 10 -r 320*240“ ,打开对应的input_uvc.so动态链接库

通过dlopen函数打开动态链接库

(4) 主函数通过解析命令行-o "output_http.so -w www" ,打开对应的out_http.so动态链接库

2、输入插件和输出插件所做的工作

(1)输入插件1(input_uvc.c文件)

input结构体

(2)输入插件2

init函数

主要执行init_videoIn函数

传入参数宽度width ,高度height,帧率fps,格式format

init_videoIn所做工作:①调用init_v4l2函数(通过V4L2提供的一系列的ioctl来设置摄像头的分辨率,帧率,以及摄像头的输出格式,并分配缓冲区然后映射到应用程序空间videoIn->mem[i]);②分配一个临时缓冲区videoIn->tmpbuffer,用于接收摄像头数据(摄像头数据流向为:videoIn->mem[i]     ----->  videoIn->tmpbuffer     ----->  globals->buf(我们所说的仓库) ---------->输出通道取出数据外发)

run函数

主要执行创建线程函数参数里面的cam_thread函数

所做工作:调用uvcGrab函数(该函数把一帧数据从拷贝videoIn->mem[i] 里拷贝到videoIn->tmpbuffer)获取一帧数据

判断获得数据的格式,如果输入数据格式是MJPEG格式,直接把它拷贝到 global结构体的buf里面(也就是放入仓库);如果是YUV格式,要把YUV格式数据转变成MJPEG格式的数据再拷贝到global结构体的buf里面(也就是放入仓库globals->buf)

stop函数

做一些清理工作

(3)输出插件1

output结构体

(4)输出插件2

init函数

socket编程以及用socket来模拟http协议,因此做socket的一些初始化工作,如端口号

run函数

从仓库中取出数据,存到一个缓冲区中,然后通过write函数将数据发送出去,供手机或其他设备接收

stop函数

做一些清理工作

本文参考链接:

https://blog.csdn.net/qingkongyeyue/article/details/52400036

https://blog.csdn.net/qingkongyeyue/article/details/52401514

https://blog.csdn.net/qingkongyeyue/article/details/52824165

mjpg-streamer框架分析相关推荐

  1. Flutter框架分析(五)-- 动画

    Flutter框架分析分析系列文章: <Flutter框架分析(一)-- 总览和Window> <Flutter框架分析(二)-- 初始化> <Flutter框架分析(三 ...

  2. hdfs文档存储服务器,一文读懂HDFS分布式存储框架分析

    一文读懂HDFS分布式存储框架分析 HDFS是一套基于区块链技术的个人的数据存储系统,利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务,将闲置的存储空间利用起来,服务于正处于爆发期 ...

  3. 需求评审五个维度框架分析及其带来的启示-3-典型需求评审

    典型情境是指软件开发的常见情境,本文选择如下来进行分析: 1. 传统瀑布模型开发下的需求评审 2. 使用IEEE Std. 1028的需求评审 3. 敏捷开发下的需求评审 传统瀑布模型下的需求评审 对 ...

  4. java连接linux服务器执行shell命令(框架分析+推荐)

    java连接linux服务器执行shell命令(框架分析+推荐) 一.分类+连接方式 程序打成jar包,在本地服务器上执行shell命令.这种使用MyRuntimeUtil工具类 java程序远程li ...

  5. Linux USB驱动框架分析 【转】

    转自:http://blog.chinaunix.net/uid-11848011-id-96188.html 初次接触与OS相关的设备驱动编写,感觉还挺有意思的,为了不至于忘掉看过的东西,笔记跟总结 ...

  6. linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析

    驱动代码位于: sound/soc/codec/alc5623.c 随便找个Linux内核都会有. 1.首先进行i2c总线驱动加载在: static int __init alc5623_modini ...

  7. Janus流媒体服务器框架分析

    Janus流媒体服务器框架分析 目录 webrtc多方通信架构 Janus流媒体服务器 1. webrtc多方通信架构 1. Mesh 方案 Mesh方案即多个终端之间两两进行连接,形成一个网状结构. ...

  8. FFmpeg过滤器框架分析

    FFmpeg过滤器框架分析 目录 主要结构体和API介绍 AVFilterGraph-对filters系统的整体管理 AVFilter-定义filter本身的能⼒ AVFilterContext-fi ...

  9. Prototype 框架分析(一)

    Prototype 框架分析(一) Class 关于javascript的面向对象设计可以参看MSDN上的文章<JavaScript使用面向对象的技术创建高级 Web 应用程序>,这样理解 ...

  10. OpenGL研究, GUI框架分析, 虚拟机比较, Win10历险记, WxWidget, uboot, WireShark

    http://antkillerfarm.github.io/ OpenGL研究 书籍 我手上其实有几本关于OpenGL的实体书,但是比较了一下之后,发现还是电子版的<OpenGL编程指南> ...

最新文章

  1. CodeForces Round #287 Div.2
  2. html5 css 笔记,HTML5+CSS3笔记
  3. 周刊#003提要:吴恩达团队盘点2019 AI 大事件圣诞 AI 论战
  4. python制作好看的界面_【一点资讯】Python界面如何漂亮的展示树形结构,PyQt5控件之QTreeWidget详解 www.yidianzixun.com...
  5. mysql mpm_zabbix mpm 监控 mysql性能
  6. char类型是多少 mat_opencv之Mat数据类型
  7. centos mysql 远程连接_Linux下开启MySQL的远程连接
  8. SQL Server 2005 cmd工具的使用
  9. 程序的内存分配和管理
  10. leetcode之String to Integer (atoi)
  11. oracle临时表空间自动清理,Oracle 临时表空间满的清理
  12. python调试神器snoop,让你告别print
  13. QQ游戏基本通信机制(QQ游戏外挂编写)
  14. Java写的一个简易木马(仅供自娱自乐)(基于UDP实现版)
  15. TS 中的 keyof 和 typeof 操作符
  16. android 布局滑动消失,SlideUp-Android
  17. 流体仿真中,六面体(Hex)网格的求解效率真的比四面体(Tet)高”很多”么?
  18. java 堆中的新生代_Java堆内存_Young Gener_Old Generation_新生代和老年代
  19. C++ Socket网络编程
  20. php怎么让日期变成数字形似,excel如何把日期变成纯数字

热门文章

  1. ZooKeeper的原理(转)
  2. Python基础(8)_迭代器、生成器、列表解析
  3. HDU 5794:A Simple Chess(Lucas + DP)
  4. Codeforces Round #318 (Div. 2) B Bear and Three Musketeers (暴力)
  5. centos 6.5网卡dhcp不能获得网关
  6. c语言self用法,C/C++知识点之Self Numbers C语言 UVA640
  7. OD debug matlab,OllyDebug基本使用方法
  8. linux 修改jmeter内存溢出,jmeter本机内存溢出如何修改?
  9. int定义源码 python_python学习(第一章)
  10. java默认值_Java中八种基本数据类型的默认值