当前位置: 首页 > news >正文

智慧家居中的视频监控系统-------2、MJPG-streamer方案的实现

前言

最近想做一个安防相关的项目,所以跟着韦东山老师的视频来学习视频监控方案的相关知识,韦东山老师讲的课非常好,这里用到的开发板是IMX6ULL

一、JPEG,MJPG格式简介

JPEG

  • 简称JPG
  • 上过美术课的人都知道一个象素的颜色可以用RGB三原色来表示,其实还可以用YUV格式来表示使用RGB、YUV的格式编码的照片,文件都很大,比如常见的BMP文件就是用RGB编码
  • 把一个BMP文件转换为JPEG文件,可以发现图片质量没发生变化,但是文件变小了很多
  • JPEG是根据人体视觉的特点采用了YCbCr格式,大大压缩了照片的大小

MJPG

  • Motion JPEG,简称MJPG
  • JPEG是静态图片的编码格式,MJPG是动态的视频编码格式
  • 可以简理解:MJPG就是把多个JPEG图片连续显示出来

MJPG的优点

  • 很多摄像头本身就支持JPEG、MJPG,所以处理器不需要做太多处理
  • 一般的低性能处理器就可以传输MJPG视频流

MJPG的缺点

  • MJPG只是多个JPEG图片的组合,它不考虑前后两数据的变化,总是传输一顿帧图像: 传输带宽要求高
  • H264等视频格式,会考虑前后两顿数据的变化,只传输变化的数据: 传输带宽要求低

二、软硬件准备

硬件:a. 100ASK_IMX6ULL开发板 (或其他Linux开发板);b. USB摄像头

软件:a. Ubuntu;b. Buildroot(Buildroot会自动下载其他软件: MJPG-streamer, ffmpeg, nginx)

三、编译MJPG-streamer

进入Buildroot根目录

执行命令

make menuconfig

image

/ 搜索 mjpg 查找 MJPG-streamer 位置

image

image

选上MJPG-streamer后退出保存

image

执行命令 make

这会在Buildroot的dl/mjpg-streamer目录下自动下载源码,并编译

结果保存在output/images目录下,有emmc.img, sdcard.img,可以直接烧写到板能的EMMC或SD卡上

编译后的结果

ls output/images/

19bc36020c26045eb0c00493dd73396a_88ec7d7efaa24a16bad19c6048297601.png

烧写.img后缀到IMX6ULL开发板

四、运行MJPG-streamer

在开发板上安装好MJPG-streamer后,执行命令:

mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 90 -n" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www"

参数:

// 指定这个库的绝对路径 –i 指定一个输入的动态库 -o 指定另一个输出的动态库

  • -d /dev/video1 -f 30 -q 90 -n”是参数 给input_uvc.so用 处理输入数据
  • -w /usr/share/mjpg-streamer/www“ 是参数 给output_http用 处理输出数据
  • /dev/video1是我所使用的usb摄像头的位置,-f 30 -q 90 指定格式以及质量。

在PC端或手机上:

确保PC或手机,跟开发板处于同一个局域网

假设开发板IP为:192.168.1.6

在chrome浏览器中打开: http://192.168.1.6:8080/stream.html

就可以看见视频了

五、其它常见用法

查看帮助:

mjpg_streamer -o "/usr/lib/mjpg-streamer/output file.so --help"

mjpg_streamer -i "/usr/lib/mjpg-streamer/input file.so --help"

把摄像头数据存为JPG文件:

从input得到数据 保存到tmp目录

mjpg streamer -i "usr/ib/mjpg-streamer/input uvc.so -d /dev/video1 -f 30 -g 90 -n" -o "/usr/lib/mjpg-streamer/output_file.so -f /tmp"

把JPG文件输出到浏览器:

从tmp目录获得文件发到浏览器

mjpg_streamer -i "usr/lib/mjpg-streamer/input file.so -e -f /tmp" -o "/usr/lib/mjpg-streamer/output http.so -w /usr/share/mjpgstreamer/www"

六、MJPG-streamer 程序框架

buildroot选择MJPG-streamer编译完成后,会得到MJPG-streamer的源码,可以用source insight打开来进行分析

eb892ac18cdb8d8ffc169b46984543a4_db1ab93d1018446491c4cbee456bd986.png

韦老师对于MJPG-streame的分析,适合初学者学习,我们可以清晰的看出每个关键函数的调用关系,涉及到网络编程、多线程等知识。

这里我比较关注的是图中右下角client线程的部分,在观察源码后我知道,它是对于每一个client的连接都会创建一个client线程去处理。

当我访问http://192.168.1.6:8080/stream.html的时候,会创建一个client线程与之对应,处理数据。

http://www.dtcms.com/a/35623.html

相关文章:

  • 迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-配置 rk3568_uart_config.hcs
  • 即将发布书籍 - Yocto项目实战教程:高效定制嵌入式Linux系统
  • 为什么要将PDF转换为CSV?CSV是Excel吗?
  • 如何实现应用程序与中间件的类进行隔离
  • 无人机实战系列(二)本地摄像头 + Depth-Anything V2
  • python学习一
  • 算法系列之搜素算法-二分查找
  • 一.Vue中的条件渲染
  • vue 修改el-tree高亮样式
  • Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南
  • 一周热点:Replit-用于下单的移动应用程序
  • 【Pandas】pandas Series where
  • 欧拉回路与哈密尔顿回路: Fleury算法与Hierholzer 算法(C++)
  • 从图片生成3维场景--NERF原理解析及加速版HashNeRF-pytorch代码实现
  • (九)Mapbox GL JS 中 Marker 图层的使用详解
  • 学习笔记04——JMM内存模型
  • 在Spring Boot+Vue前后端分离的项目中使用JWT实现基本的权限校验
  • 数据安全_笔记系列01:数据分类分级与敏感数据识别详解
  • 内容中台智能推荐系统的模型演进
  • CSS中padding和margin属性的使用
  • Flutter系列教程之(2)——Dart语言快速入门
  • docker-Compose工具使用
  • Go入门之接口
  • VMware虚拟机17.5.2版本下载与安装(详细图文教程包含安装包)
  • C语言:字符函数和字符串函数
  • 【Swift 算法实战】利用 KMP 算法高效求解最短回文串
  • scp工具
  • ES6新增的变量
  • (七)趣学设计模式 之 适配器模式!
  • 算法15--BFS