远程视频监控之应用篇(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) 的相关文章

  • adaboost提升算法

    引言 俗话说得好 xff0c 三个臭皮匠赛过诸葛亮 更主要的是三个臭皮匠好找 xff0c 一个诸葛亮太难找了 在机器学习里面也是一样的 我们可以设计出各种分类器 xff0c 然而分类器的效果确实不一而同的 xff0c 相对而言 xff0c
  • 长虹电视刷机固件包汇总

    为了解决部分朋友因应用引起的电视死机 无法开机 系统被破坏等情形 xff0c 快客服务特开此帖为朋友们提供刷机方法 xff0c 但刷机有风险 xff0c 如完全不懂刷机技巧的朋友需要谨慎操作 xff0c 用户自行刷机所产生问题自行负责 xf
  • WebRTC-集成qsv硬解码实现

    1 Window下QSV硬解码配置 在libavcodec codec list c下添加 amp ff h264 qsv decoder 在ffmpeg generate gni下加入 34 libavcodec h264idct c 3
  • ijkplayer-添加播放截图功能

    应用播放的时候需要截图 xff0c 可以在上层使用TexturView来使用截图 xff0c 不过太具有局限性呢 xff0c 还是在底层处理比较好 那么先分析下可以在哪里加截图呢 xff1f 看到网上很多做的都不能支持硬解截图 xff0c
  • avformat_seek_file及其flag含义

    我们从ijk中seek的处理流程来看ffmpeg的这个问题 int ffp seek to l FFPlayer ffp long msec assert ffp VideoState is 61 ffp gt is int64 t sta
  • 单例模式

    单例模式 xff1a include lt iostream gt using namespace std class Singleton public Singleton cout lt lt 34 Singleton虚构函数 34 lt
  • ffmpeg系列-解决ffmpeg获取aac音频文件duration不准

    这个问题是这样产生的 xff0c 一同事反应会随机出现ijk获取到的aac文件的duration不准 xff0c 发来一看 xff0c 确实不准 xff0c 在AE或者系统mediaplayer中得到的都是8 4秒 xff08 准确时间是M
  • 基于librtmp的推流实现

    1 推流 配置好rtmpdump库后 xff0c 我们可以先用命令行来推流看下效果 2 流程图 使用librtmp发布RTMP流的可以使用两种API xff1a RTMP SendPacket 和RTMP Write 使用RTMP Send
  • ijkplayer-音视频变速播放实现

    本文主要分析变速播放框架实现细节 xff0c 不分析sonic以及soundtouch变速算法 在我的sonic变速变调原理一文中会详细讲解基于基音周期来实现变速变调的原理 1 变速入口分析 从jni层的 setPropertyFloat函
  • 提升树,bagging与随机森林

    提升树是一种以分类树或者回归树为基本分类器的提升方法 对于分类树只需将adaboost算法中的基函数设置为二分类二叉树即可 而回归树则是根据残差来训练下一个分类器的回归二叉树 下面主要介绍一下回归提升树的算法 回归提升树 回忆一下 xff0
  • Android_WakeLock使用

    1 前言与WakeLock简介 1 1 前言 一些手机app xff08 如微信 QQ等 xff09 有新消息来到达 xff0c 手机屏幕即使在锁屏状态下也会亮起 xff0c 并提示用户有新消息 但是 xff0c 一般情况下手机锁屏后 xf
  • ContentResolver.query详解

    1 查询手机的联系人 public void getContacts ContentResolver contentResolver 61 this getContentResolver Cursor cursor 61 contentRe
  • jni开发-GetMethodID与CallObjectMethod的坑

    在java层中声明一个方法用于创建一个audiotrack xff0c 在C层中调用这个方法并获取audiotrack对象 先看下面的代码 xff1a SuPlayer java public AudioTrack createAudioT
  • docker启动rabbitMQ访问不了管理界面-问题解决

    rabbitMQ可以在docker上面去安装启动 xff0c 这样快捷方便 xff0c 也利于本地开发的调试 先在docker下去拉取docker docker pull rabbitmq 这样拉取了rabbitMQ最新的版本后 xff0c
  • Royal TSX 从入门到高效使用

    Royal TSX 是一款 macOS 下可用的远程连接软件 xff0c 类似于 Windows 系统的 XShell 免费版最多支持 10 个连接 xff0c 对于个人开发而言 xff0c 已经足够了 目录 引言 一 下载安装 二 基础配
  • PIP升级错误解决方法

    pip span class token function install span upgrade pip 执行后报如下错误 Looking span class token keyword in span indexes https p
  • 使用自定义菜单等接口类功能出现“SSL connect error”的错误原因及解决方案

    这种情况很少出现 xff0c 但是出现了很难排查 xff0c 因为环境检测结果就是curl openssl都开启了 xff0c 为什么还是不行呢 xff1f 通过技术人员耐心的排查发现是CURL中SSL的版本太低 xff0c 不支持CURL

随机推荐

  • 删除数组中的某个数字

    span class hljs comment 这个程序是今天多益网络的编程题 xff0c 很简单的删除一个数组中值为2的元素 span span class hljs comment 看着很简单 xff0c 但是我没有做出来 xff0c
  • 强化学习和控制

    马尔科夫决策过程MDP值迭代和政策迭代 值迭代政策迭代比较 MDP模型无限状态的MDPs 离散化值函数估计 使用一个模型或模拟器适应值迭代 在强化学习中 xff0c 我们将提供一个奖赏函数 xff0c 当目标完成的好时 xff0c 便奖赏
  • Centos7——防火墙(Firewall)开启常见端口命令

    Centos7 默认安装了 firewalld xff0c 如果没有安装的话 xff0c 则需要YUM命令安装 xff1b firewalld真的用不习惯 xff0c 与之前的iptable防火墙区别太大 安装Firewall命令 xff1
  • FTP服务器下载视频,自定义保存路径

    FTP服务器下载视频 xff0c 自定义保存路径 controller层方法 当前使用 xff0c 浏览器自动弹框 Description 从FTP服务器下载文件 64 param host FTP服务器hostname 64 param
  • OEPNCV_摄像头采集显示

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • ArchLinux系统安装(BIOS)

    一 简介 Arch linux 是朝向轻量 xff08 lightweight xff09 以及简单 xff08 simple xff09 的 Linux 发行版 其中 简单 xff08 Simplicity xff09 被定义为 避免不必
  • Android 常见的抓log方法总结

    1 kernel log 1 adb shell dmesg gt c log dmesg txt 2 adb shell cat proc kmsg gt c log kmsg 3 findstr xx 只看xx相关的log 4 查看特定
  • 工作纪实_24-使用@Sl4j注解但是确无法使用log.info打印日志

    如果出现这种情况 xff0c 第一时间先执行打包mvn clean package命令 xff0c 这么做是为了检查log日志包是否齐全 xff0c 此次我打包报错是找不到org slf4j包 xff0c 很明显 xff0c 我们检查一下相
  • gradle-wrapper.properties中各属性的含义

    gradle wrapper properties中各属性的含义 1 gradle wrapper properties 每一个用gradle编译的工程 xff0c 都会有一个gradle wrapper目录 该目录下有2个文件 xff1a
  • cordova 打包步骤

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

    视图的绑定从另一个角度看就是implicit的转换 主要用在两个场合 1 当一个T类型的变量t要装换成A类型时 2 当一个类型T的变量t无法拥有A类型的a方法或变量时 其实视图的绑定是为了更方便的使用隐式装换 如果我们不用视图绑定看看 这个
  • 【Settings随记:二】一级菜单,二级菜单的添加与隐藏,添加辅助功能

    我们可以先从Settings的启动来看 先进入到AndroidManifest xml 找到启动的Activity span class token tag span class token tag span class token pun
  • 新加装的硬盘,装上系统后发现EFI分区没有被创建,还是用旧硬盘的EFI分区

    引发问题 xff1a 如果没有旧硬盘就没法引导系统 xff0c 没法开机 解决办法 xff1a 在新硬盘增加一个EFI分区 目前情况大概就是这个样子 xff1a xff08 本人忘了截图 xff0c 用别人的 xff09 可见 xff0c
  • 信息安全重点知识

    一 信息安全概述 网络空间安全的重要性 xff1a 没有网络安全就没有国家安全信息安全 xff1a 防止数据未授权的访问 xff0c 数据有意和物一的威胁 网络安全是信息安全的子集 信息安全的三要素 xff08 CIA xff09 xff1
  • 线程同步的四种方式

    一 xff0c 什么是线程同步和互斥 同步就是协同步调 xff0c 按预定的先后次序进行运行 如 xff1a 你说完 xff0c 我再说 这里的同步千万不要理解成那个同时进行 xff0c 应是指协同 协助 互相配合 线程同步是指多线程通过特
  • 海天注塑机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 使小伙伴们了解视频监控的实现