当前位置:   article > 正文

安防监控实现之mjpeg-streamer视频图像的显示

mjpeg-stream

声明

写在最前面 华清远见教育集团 15年专注高端IT培训 做良心教育,做专业教育,做受人尊敬的职业教育

创客学院官网:http://www.makeru.com.cn/
华清远见创客学院嵌入式课程链接:http://www.makeru.com.cn/emb
华清远见创客学院物联网课程链接:http://www.makeru.com.cn/iot

视频服务器—mjpg-streamer

实现远程视频监控需要视频服务器,于是 mjpg-streamer 这个开源软件变成了我们的选择之一,并且成为我们最终的选择,mjpg-streamer 提供多种输入及输出方式。输入可以是一个 camera 也可以是一个文件,输出可以是一个文件也可以以 HTTP 的方式 输出到远程客户端,这里我们选择的方式是从 camera 中\取数据以 HTTP 的方式发送到远端客户端。远端客户端可以是任何支持 stream 传输的 web 浏览器。

概述&系统框图

在这里插入图片描述
UVC摄像头+驱动+JPEG图库+mjpeg-streamer+HTML 完成了对用户远程提供视屏展示的服务。首先底层通过摄像头采集图片,通过驱动将数据流存储到JPEG图库,最终通过html交给用户的浏览器来解析,而mjpeg-streamer用来实现对这一流程的的控制。构成mjpeg-streamer视频流服务器。

MJPG简介

  1. MJPG 是 MJPEG 的缩写,但是 MJPEG 还可以表示文件格式扩展名.
  2. MJPEG 全名为 “Motion Joint Photographic Experts Group”,是一种视频编码格式,
  3. Motion JPEG 技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘
    上。典型的应用如数字视频记录器等。MJPEG 不像 MPEG,不使用帧间编码,因此用一个非线性编辑器就很容易编辑。
  4. MJPEG 的压缩算法与 MPEG 一脉相承,功能很强大,能发送高质图片,生成完全动画视频等。
  5. 但相应地,MJPEG 对带宽的要求也很高,相当于 T-1,MJPEG 信息是存储在数字媒体中的庞然大物,需
    要大量的存储空间以满足如今多数用户的需求。
  6. 因此从另一个角度说,在某些条件下,MJPEG 也许是效率最低的编码/解码器之一。
  7. MJPEG 是 24-bit 的 “true-color” 影像标准,MJPEG 的工作是将 RGB 格式的影像转换成 YCrCB 格
    式,目的是为了减少档案大小,
  8. 一般约可减少 1/3 ~ 1/2 左右。

MJPEG 与 MJPG 的区别

  1. mjpeg 是视频,就是由系列 jpg 图片组成的视频。
  2. MJPG 是 MJPEG 的缩写,但是 MJPEG 还可以表示文件格式扩展名.

关于UVC摄像头

免驱动摄像头,是一种遵循视频设备类(USB Video Class,简称UVC)标准协议的摄像头产品。将符合标准的摄像头连接到符合标准的操作系统,系统就会自动为其安装驱动并进行设置,使摄像头实现真正意义上的即插即用。
uvc是一种硬件的框架结构,只有当其是通过一种标准的设计使其实现了免驱;而V4L2是一种驱动程序,其是实现系统与uvc设备等的通信。
https://blog.csdn.net/codectq/article/details/44451237#commentBox

查看摄像头的信息

查看我的摄像头信息,执行dmesg信息打印如下
在这里插入图片描述
在这里插入图片描述

移植过程

添加驱动编译到内核上

内核选配 添加驱动支持USB储存设备

  1. 进入内核目录:cd linux-3.14

     执行 #make menuconfig
         Device Drivers --->
            [*] USB support --->
            		<*> EHCI HCD (USB 2.0) support
            		<*> EHCI support for Samsung S5P/EXYNOS SoC Series
            		<*> USB Mass Storage support
            		<*> USB3503 HSIC to USB20 Driver
            		USB Physical Layer drivers --->
            		<*> Samsung USB 2.0 PHY controller Driver
             		
     	    CSI device support --->
     	    <*> SCSI device support
     	    <*> SCSI disk support
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  2. 选中 Multimedia support

     Device Drivers --->
         <*> Multimedia support --->
         如图配置:
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  3. 再进入 Media USB Adapters

    Device Drivers --->
    		<*> Multimedia support --->
    		<*>Media USB Adapters --->
    		如图配置
    
    • 1
    • 2
    • 3
    • 4

在这里插入图片描述
4. 进入 GSPCA base webcams

    Device Drivers --->
    <*> Multimedia support --->
    <*>Media USB Adapters --->
    <*>GSPCA base webcams
    如图配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190710165902303.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly96aHV6aG9uZ3dlaS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  1. 进入 V4L platform devices

     Device Drivers --->
     <*> Multimedia support --->
     <*>V4L platform devices --->
     如图配置
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  2. 编译内核

     #make uImage
     重新拷贝到我们的 tftp 目录下
    
    • 1
    • 2

mjpg-stream 的移植

jpeg 库的移植

  1. jpeg 源码包通过下面这个网址下载
    http://www.ijg.org/files/jpegsrc.v8b.tar.gz

  2. 解压源码包

    tar xvf jpegsrc.v8b.tar.gz
    
    • 1
  3. 配置源码

     cd jpeg-8b    
    ./configure --prefix=/home/zzw/share/Security_Monitoring/mjpeg-streamer/video/jpegarm --host=arm-none-linux-gnueabi 
    
    • 1
    • 2

(注意:–prefix 表示最终生成的库和头文件等存放的目录,自己指定一个存在的路径就可以, 后面编译 mjpeg-streamer
的时候回用到,此处必须使用绝对路径,–host=arm-none-linux-gnueabi
–host 表示生成的库的运行平台,注意是两个 - ,末尾不能加- ,./configure 之后为一行命令)

  1. 编译 make

  2. 安装make install

  3. 拷贝库到文件系统中

     sudo cp /home/zzw/share/Security_Monitoring/mjpeg-streamer/video/jpegarm/lib* /nfs/rootfs/lib/
    
    • 1

移植 mjpg-streamer

  1. 下载源码
    官网:https://sourceforge.net/projects/mjpg-streamer/

  2. 文件结构

    ├── doc
    ├── mjpeg-client     #分别有 linux和windows 的客户端 
    ├── mjpg-streamer    #目录下提供了 的执行程序和各个输入输出设备组件
    ├── mjpg-streamer-experimental
    ├── udp_client
    └── uvc-streamer     #目录下提供了 uvc-streamer的可执行目录 
    6 directories, 0 files
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  3. 修改源码出处

     CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
     (CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)
    
    • 1
    • 2

    在这里插入图片描述

  4. 在 mjpg-streamer-code-182/mjpg-streamer 目录下

     编译:make CC=arm-linux-gcc
     在 mjpg-streamer 生成了
     input*.so output*.so 和 mjpg_streamr 可执行文件
     小问题:
     make CC=arm-linux-gcc
     make: svnversion: Command not found
     解决方案:sudo apt-get install subversion
     安装之前先更新一下软件包的源和依赖:
     Sudo apt-get update 更新软件源
     Sudo apt-get -f install 更新依赖
     再次编译:
     make
     Nothing to be done for `all'.
     先
     make clean,
     然后再
     make CC=arm-linux-gcc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    查看生成的库和可执行的文件:
    在这里插入图片描述

  5. 在开发板建立 mjpg-streamer 安装目录 (关键性的拷贝过程)

     mkdir /home/nfs/rootfs/mjpg-streamer (你的根文件系统目录)
     cp *.so /home/nfs/rootfs/mjpg-streamer -arf
     cp mjpg_streamer/home/nfs/rootfs/mjpg-streamer -arf
     将源码目录中的 start.sh 和目录 www 拷贝到 /nfs/rootfs/mjpg-streamer/目录
     下,然后就可以测试啦
     sudo cp start.sh www/ /nfs/rootfs/mjpg-streamer/ -arf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  6. 测试 ./start.sh
    在这里插入图片描述

HTML文件

将对服务器url请求,IP配置为服务器的IP地址,这里是192.168.2.10

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>摄像头</title>
</head>

<body>

	<body background="./images/huaqing002.jpg">
		<table width="652" height="217" background="./images/安防监控.jpg" border="0" align="center">
			<tr>
				<td>&nbsp;</td>
			</tr>
		</table>
		<tr>
			<table width="652" height="35" background="" border="0" align="center">
				<tr>
					<td width="328">
						<div align="center">摄像头</div>
					</td>
					<td width="314">
						<div align="center">
							<a href="home1.html">回主页</a>
						</div>
					</td>
				</tr>
			</table>
			<tr>
				<table width="652" align="center" height="480" border="2">
					<tr>
						<td height="500"><img src="http://192.168.2.10:8080/?action=stream" /></td>
					</tr>
					<tr>
						<td height="34">
							<form id="form3" name="form3" method="post" action="cgi-bin/capture1.cgi"><input name="store" type="hidden" value="1" />
								<table width="500" border="1" bgcolor="#CCFFFF" bordercolor="#5500FF">
									<tr>
										<td width="57">张数:</td>
										<td width="195">
											<p>
												<label>
          <input type="radio" name="mode" value="1" id="mode_0" />
          1</label>

												<label>
          <input type="radio" name="mode" value="3" id="mode_1" />
          3</label>

												<label>
          <input type="radio" name="mode" value="5" id="mode_2" />
          5</label>

												<label>
          <input type="radio" name="mode" value="7" id="mode_3" />
          7</label>

												<label>
          <input type="radio" name="mode" value="9" id="mode_4" />
          9</label>
												<br />
											</p>
										</td>
										<td width="226">
											<div align="center">
												<input type="submit" name="button3" id="button3" value="抓拍" />&nbsp;&nbsp;&nbsp;
												<a href="cgi-bin/picture1.cgi">历史照片</a>
											</div>
										</td>
									</tr>
								</table>
							</form>
						</td>
					</tr>
				</table>

	</body>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75

错误总结

问题:第一次运行发现页面没有图像显示,确定html文件中的ip地址是目标机
原因:市面上大部分摄像头都是支持YUV的,而不是JPEG的。 
解决方法:修改 启动脚本文件 由于mjpg-stream支持JPEG和YUV两种格式,所以只需修改start.sh,在输入中加入 ” - y “ 
  • 1
  • 2
  • 3

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/280129
推荐阅读
相关标签
  

闽ICP备14008679号