手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现

往期文章
手把手教你做一个物联网视频监控项目(一) 介绍
2022年春招实习十四面(嵌入式面经)(已完结)

文章目录

  • 前言
  • 一、JPEG,MJPG格式简介
  • 二、软硬件准备
  • 三、编译MJPG-streamer
  • 四、运行MJPG-streamer
  • 五、MJPG-streamer框架
  • 六、其它常用函数用法
  • 七、源码下载


前言

最近想做一个安防相关的项目,所以需要储备视频监控方案的相关知识,冲韦东山老师的视频中学到了相关知识,很好地满足我的需求。特将学习的整个过程、笔记记录下来,本系列文章将会引用许多韦老师项目的内容,有兴趣的同学可以去看看韦老师的这个课程,原理讲得不深,但是单纯应用绝对够用
韦东山老师手把手带你从0开始自己做一个视频监控项目

一、JPEG,MJPG格式简介

1.JPEG
简称JPG

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

2.MJPG

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

MJPG的优点

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

MJPG的缺点

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

二、软硬件准备

硬件:a. 100ASK_IMX6ULL开发板 (或其他Linux开发板);b. USB摄像头
软件:a. Ubuntu(可以用虚拟机安装Ubuntu);b. Buildroot(Buildroot会自动下载其他软件: MJPG-streamer, ffmpeg, nginx);

三、编译MJPG-streamer

有两种方法:
下载源码,手工编译
使用Buildroot,配置选择MJPG-streamer,直接编译生成映象文件
我们使用Buildroot(简单), 步骤如下:

  1. 在ubantu中设置交叉编译工具链 具体参考自己所用的ubantu对arm板的交叉编译工具链的路径。我的是:
   export ARCH=arm 
export CROSS_COMPILE=arm-linux-gnueabihf-   
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
  1. 在Buildroot根目录 输入make menuconfig进入配置界面
  2. 如下图选择MJPG-streamer (可以在界面中输入‘/’符号搜索MJPG 就能找到路径了)
    手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现_第1张图片
  3. 执行make
    这会在Buildroot的dl/mjpg-streamer目录下自动下载源码,并编译
    结果保存在output/images目录下,有emmc.img, sdcard.img等img,可以直接烧写到开发板的EMMC或SD卡上

四、运行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"

在PC或手机上:
确保PC或手机,跟开发板处于同一个局域网
假设开发板IP为:192.168.2.123
在chrome浏览器中打开:http://192.168.2.123:8080/stream.html
就能观察到摄像头的图像了。

参数解释
//指定这个库的绝对路径 –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 指定格式以及质量。

五、MJPG-streamer框架

buildroot选择MJPG-streamer编译完成后,会得到MJPG-streamer的源码,可以打开来进行分析,需要下载的也可以在本文末进行下载。
手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现_第2张图片
如图为韦老师对于MJPG-streame的分析,可以清晰的看出每个关键函数的调用关系,涉及到网络编程、多线程等知识。
这里我比较关注的是图中右下角client线程的部分,在观察源码后我知道,它是对于每一个client的连接都会创建一个client线程去处理,也就是说当我访问http://192.168.2.123:8080/stream.html的时候,会创建一个client线程与之对应,处理数据。
验证如下:

在这里插入图片描述
后台运行的时,本来有3个线程,打开网站链接后有4个线程(一次连接一个client),再开一个新页面,就会有五个线程,即每一个链接创建一个client线程。

六、其它常用函数用法

查看帮助:

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/lib/mjpg-streamer/input_uvc.so -d /dev/video1 -f 30 -q 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/mjpg-streamer/www"

七、源码下载

MJPG-streamer源码

你可能感兴趣的:(嵌入式Linux,监控类)