远程视频监控之应用篇(mjpg-streamer)

2023-05-16

       转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515311

       这篇文章将主要结合源码介绍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挂载到本地文件夹了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

远程视频监控之应用篇(mjpg-streamer) 的相关文章

随机推荐

  • 简单分析@NestedConfigurationProperty的作用

    看源码的时候 xff0c 碰到这个注解 64 NestedConfigurationProperty xff0c 之前知道 64 ConfigurationProperty是设置值的 xff0c 但是nested就不清楚了 分析如下 查看源
  • java开发的正常开发步骤和进度总结

    项目规范 需求排期阶段 1 业务提需求 xff0c 业务与PD和技术初步探讨业务背景和需求 在此阶段 xff0c 开发人员的目标是提前的了解需求 xff0c 想业务之所想 xff0c 丰富和优化需求 所以 xff0c 开发人员 xff0c
  • 降级、熔断和限流———一看就会

    设定 xff1a A上游系统 B本系统 C下游系统 服务降级 服务降级是从整个系统B的负荷情况出发和考虑的 xff0c 对某些负荷会比较高的情况 xff0c 为了预防某些功能 xff08 业务场景 xff09 出现负荷过载或者响应慢的情况
  • 高保链路分析——一看就会

    高保链路分析 本身接口 超时降级 调用本接口耗时超过规定时间立马返回超时报文 限流降级 调用本接口QPS超过规定数值立马返回限流报文 兜底返回 xff08 代码容错 xff09 trycatch未知异常 xff0c 兜底返回报文 业务逻辑
  • android应用层操作底层硬件

    app操作底层硬件没权限的解决办法 xff1a 1 若机器已经root过 xff0c 可直接在应用层中操作 xff1a String apkRoot 61 34 chmod 777 34 43 getPackageCodePath Syst
  • ARM 安装中文输入法

    TX2 为嵌入式开发板 xff0c 系统架构为ARM xff0c 普通的PC上的Linux系统安装中文输入法的方法不适用 xff0c 所以这里提供ARM上的中文输入法的安装方法 步骤1 xff1a 打开终端 xff0c 输入以下命令 sud
  • cordova 打包步骤

    年底了 xff0c 好多资料都在整理 xff0c 为了避免遗忘 xff0c 也为了利益他人吧 直接上步骤吧 xff1a 增加运行环境的模板 cordova platform add android 编译android的程序 cordova
  • BlueROV-7: Keep Learning Dronekit

    The motors can spin now by using the following program from dronekit import connect VehicleMode import sys import time C
  • BlueROV-8: Functions to Drive the Vehicle

    Some functions like goto function or speed setting function are limited because they are GPS dependent GPS is not availa
  • BlueROV-9: Driving Control

    Home location http python dronekit io guide vehicle state and parameters html The Home location isset when a vehicle fir
  • 人工智能发展简史

    人工智能发展简史 第一章 xff1a 起步期 20世纪50年代及以前1 1 计算机象棋博弈 xff08 Programming a computer for playing chess xff09 1 2 图灵测试 xff08 Turing
  • 对角度滤波时0-360度跳变的解决办法

    对角度滤波的过程中会发现 xff0c 视觉direction方向会发生0 360的数值跳变 xff0c 为了解决这个问题 xff0c 需要将0和360度之间的间断点变成连续可导的函数 xff0c 经过摸索 xff0c 想出一个办法 xff0
  • 电机控制 龙伯格观测器 永磁同步电机无传感器控制 全C代码程序

    电机控制 龙伯格观测器 永磁同步电机无传感器控制 全C代码程序 成熟产品方案 DSP28335 xff08 1 xff09 全C程序完成由电机参数 电流微分方程构建dq轴误差模型 控制参数逻辑变换 低通滤波器转速滤波和转子角度积分等控制环节
  • ROS学习笔记-1: 构建工作空间-创建catkin包-编写发布器与订阅器

    1 ROS文件系统介绍 http wiki ros org cn ROS Tutorials NavigatingTheFilesystem 2 Installing catkin http wiki ros org catkin Inst
  • 信息安全重点知识

    一 信息安全概述 网络空间安全的重要性 xff1a 没有网络安全就没有国家安全信息安全 xff1a 防止数据未授权的访问 xff0c 数据有意和物一的威胁 网络安全是信息安全的子集 信息安全的三要素 xff08 CIA xff09 xff1
  • 海天注塑机KEBA系统数据采集

    本文章只针对海天注塑机的KEBA系统 xff0c 因为其他注塑机厂家也用KEBA系统 xff0c 他们的采集方式可能不太一样 xff0c 所以后续有时间我将写其他文章来解释 xff08 默认你已经向海天采购了OPC组件 xff09 一 采集
  • Axure基础:事件和动态面板

    这一篇文章我们主要是将如何做系统左侧的导航 xff0c 并且告诉大家如何动态的切换各个页面 一 事件 1 事件基础 事件的核心就是什么时候做什么事 其中的什么时候可以是如下 xff1a 能做的事情如下 xff1a 2 远程监控云中的事件 监
  • 设备联网调试三板斧

    在实际的工业互联网项目中 xff0c 设备联网所占的比重越来越大 有的一期项目为了简单快速上线 xff0c 让客户直观体会到工业互联网的效果 xff0c 直接会把设备联网放在一期项目的重点 那么在做此类项目时 xff0c 设备联网调试就显得
  • 光立方完全解析

    转载请注明出处 xff1a http blog csdn net ruoyunliufeng article details 37903899 这个4 4 4的三色光立方是我在初学单片机的时候做的一个小项目 很适合给初学单片机和C语言的同学
  • 远程视频监控之应用篇(mjpg-streamer)

    转载请注明出处 xff1a http blog csdn net ruoyunliufeng article details 38515311 这篇文章将主要结合源码介绍mjpg streamer xff0c 使小伙伴们了解视频监控的实现