本帖最后由 jackeyt 于 2017-5-1 15:19 编辑
试用目录:
1、【EVB-T335开发板试用体验】1、开箱上电
2、【EVB-T335开发板试用体验】2、开发环境搭建+踩坑纪录
3、【EVB-T335开发板试用体验】3、建立linux内核source insight工程
4、【EVB-T335开发板试用体验】4、linux驱动篇:点亮一盏LED灯(上)
5、【EVB-T335开发板试用体验】5、linux驱动篇:点亮一盏LED灯(中)
此贴是【EVB-T335开发板试用体验】的第七篇:结项篇之一——移植mjpg-streamer实现监控
一、什么是mjpg-streamer
要了解什么是mjpg-streamer,首先我们先来了解一下以下概念:
在嵌入式系统中,常用的视频图像处理开源系统有:luvcview、cheese、motion、mjpg-streamer或者ffmpeg,其中:
- luvcview: 基于V4L2、SDL的程序,支持拍照录像,参数调节,代码精简实用,适合学习V4L2编程
- cheese:基于V4L2、GTK的程序,支持拍照录像,特殊视频效果
而其中,mjpg-streamer(网络摄像机程序)是我们本次项目主要完成涉及到的程序,那么mjpg-streamer到底是什么呢?
mjpg-streamer,是用于从webcam摄像头采集图像,把他们以流的形式通过基于ip的网络传输到浏览器如Firehox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备。它可以利用某些webcams的硬件压缩功能来降低服务器CPU的开销。它为嵌入式设备和一些常规服务器提供了一个轻量且更少CPU消耗的方案,因为它无需为视频帧压缩浪费大量的计算效率。
一般下载后(涉及到的源码以及相关的库,我已经放到附件中,有需要的朋友可到下方下载吧),mjpg-streamer下包含如下目录:其中mjpg-streamer提供了各个输入输出设备组件,uvc-streamer提供了uvc-streamer的可执行目录,mjpeg-client分别有linux和Window的客户端测试程序。
二、mjpg-streamer的工作流程
三、mjpg-streamer的线程流程
四、mjpg-streamer的移植过程
mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库。
4.1、jpeg库的移植
1)下载源码:http://www.ijg.org/files/jpegsrc.v8b.tar.gz
或者在附件中,下载我上传的源码包!
2)解压
- tar xvf jpegsrc.v8b.tar.gz
3)配置源码
- ./configure CC=ARM-linux-gnueabihf-gcc --host=arm-none-linux --prefix=/home/jackeyt/libjpeg --enable -shared --enable-static
4)编译
5)安装
如上图,libjpeg.so即是我们想要的库。
6.1)、在Ubuntu主机下:
- cp ./lib/libjpeg.so /home/jackeyt/SharedX/nfs/
6.2)、在开发板上:
4.2、mjpg-streamer移植前的准备
1)sudo apt-get install libsdl1.2-dev subversion
2)sudo apt-get install libjpeg62-dev
3)sudo apt-get install imagemagick
1)下载源码
在https://sourceforge.net/projects/mjpg-streamer/下载的源码(mjpg-streamer-r63)有点老了,最新的版本使用以下命令下载:(或者使用我上传的源码附件包)
- svn co https://mjpg-streamer.svn.sourceforge.NET/svnroot/mjpg-streamermjpg-streamer
2)解压源码
- tar vxf mjpg-streamer-code-182.tar.gz
3)查看目录结构
- cd mjpg-streamer-code-182/
一共有这么多目录:
doc mjpg-streamer udp_client mjpeg-client mjpg-streamer-experimental uvc-streamer
mjpg-streamer :目录下提供了 的执行程序和各个输入输出设备组件
uvc-streamer : 目录下提供了 uvc-streamer的可执行目录
mjpeg-client:: 分别有 linux和windows 的客户端
4)修改源码
修改Makfile:
(路径:home/jackeyt/mjpg-streamer-code-182/mjpg-streamer/plugins/input_uvc/Makfile)
将
- CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
改为:
- CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/jackeyt/libjpeg/include
将:
- (CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)
修改为:
- (CC)(CFLAGS) -L /home/jackeyt/libjpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
注:/home/jackeyt/libjpeg 就是上面移植jpeg库后安装的目录。
5)编译:
- make CC=arm-linux-gnueabi-gcc
在mjpg-streamer生成了:input*.so output*.so 和 mjpg_streamr 可执行文件
如下图所示:
6)拷贝至开发板上在开发板建立mjpg-streamer安装目录
拷贝
- cp /mjpg-streamer mjpg-streamer/
4.4 挂载摄像头
我们这里使用UVC免驱摄像头进行挂载,至于UVC摄像头,已经很常见了,这里不再赘述了。插入摄像头后,发现:
看来,是内核并未加入该驱动,因此,我们需要修改内核了。
1)修改内核:
Device Drivers --->
<*> Multimedia support --->
Video capture adapters--->
V4L USBdevices --->
<*> USB Video Class (UVC)
UVC input events devicesupport
<*> GSPCA based webcams --->
USB support --->
USB announce newdevices
<*> USB Gadget Support--->
<*> USB Webcam Gadget
2)
重新编译并烧录:
根据官方提供的手册进行烧录,这里不再赘述了。
3)
重新插上USB摄像头:
此时,USB摄像头已经成功识别出来,我们此时,再次输出命令,查看摄像头挂载至何处?
可以发现:我们的摄像头已经被成功挂载,并设为video0了。
4)
运行mjpg-streamer 切换至mjpg-streamer的目录,使用命令:
- ./mjpg_streamer -i "/mjpg/input_uvc.so" -o "/mjpg/output_http.so -w /www"
或者使用mjpg-streamer官方提供的脚本:
可以看到执行效果:
五 最终效果
在浏览器中输入:开发板相应的地址即可看到视频效果
- http://192.168.0.230:8080
如下图所示:
其次,我们还可以通过上文所提及的:mjpg-streamer-code-182mjpeg-clientbin下的windows或者linux的客户端进行访问: