mjpg-streamer学习笔记2----框架分析

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

(1)global结构体

输入对应的是input结构体(输入插件)

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

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

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

mjpg-streamer学习笔记2----框架分析_第1张图片

(2)mjpg-streamer-r63文件

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

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“ 命令行对应的操作函数操作

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


(4) -o "output_http.so“命令行对应的操作函数操作


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

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

input结构体

mjpg-streamer学习笔记2----框架分析_第2张图片

(2)输入插件2

init函数

主要执行init_videoIn函数

  • 传入参数

宽度width ,高度height,帧率fps,格式format


  • 所做工作
调用init_v4l2函数(通过一系列的ioctl来完成设置摄像头的分辨率,帧率,以及摄像头的输出格式),分配一个临时缓冲区



run函数

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

mjpg-streamer学习笔记2----框架分析_第3张图片

  • 所做工作
调用uvcGrab函数获取一帧数据

mjpg-streamer学习笔记2----框架分析_第4张图片

判断获得数据的格式

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

mjpg-streamer学习笔记2----框架分析_第5张图片

stop函数

做一些清理工作



(3)输出插件1

output结构体

mjpg-streamer学习笔记2----框架分析_第6张图片

(4)输出插件2

init函数

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

run函数

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

stop函数

做一些清理工作

你可能感兴趣的:(mjpg-streamer)