盈鹏飞嵌入式
直播中

jackeyt

10年用户 283经验值
擅长:EMC/EMI设计 嵌入式技术 控制/MCU MEMS/传感技术 嵌入式技术
私信 关注
[话题]

【EVB-T335开发板试用体验】【结项帖】移植mjpg-streamer实现监控(上)

本帖最后由 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的程序,支持拍照录像,特殊视频效果
  • motion:移动侦测拍照程序
  • mjpg-streamer:网络摄像机程序
  而其中,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)解压
  1. tar xvf jpegsrc.v8b.tar.gz
3)配置源码
  1. ./configure  CC=ARM-linux-gnueabihf-gcc --host=arm-none-linux  --prefix=/home/jackeyt/libjpeg  --enable -shared --enable-static
libjpg1.jpg

4)编译
  1. make
如下:

libjpg2.jpg

5)安装
  1. make install
结果如下:
libjpg3.jpg

libjpg4.jpg

如上图,libjpeg.so即是我们想要的库。

6)拷贝库文件相关至开发板lib目录下
6.1)、在Ubuntu主机下:
  1. cp ./lib/libjpeg.so  /home/jackeyt/SharedX/nfs/
6.2)、在开发板上:
  1. cp /mnt/libjpeg.so /lib/

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
mjpg3.jpg

4.3、mjpg-streamer移植

1)下载源码
  在https://sourceforge.net/projects/mjpg-streamer/下载的源码(mjpg-streamer-r63)有点老了,最新的版本使用以下命令下载:(或者使用我上传的源码附件包)
  1. svn co https://mjpg-streamer.svn.sourceforge.NET/svnroot/mjpg-streamermjpg-streamer
2)解压源码              
  1. tar vxf mjpg-streamer-code-182.tar.gz
3)查看目录结构      
  1. cd mjpg-streamer-code-182/
    再使用ls命令查看:
    mjpg7.jpg
一共有这么多目录:
doc mjpg-streamer udp_client mjpeg-client mjpg-streamer-experimental uvc-streamer
mjpg-streamer :目录下提供了 的执行程序和各个输入输出设备组件
uvc-streamer : 目录下提供了 uvc-streamer的可执行目录
mjpeg-client:: 分别有 linux和windows 的客户端
mjpg8.jpg

4)修改源码
修改Makfile:
(路径:home/jackeyt/mjpg-streamer-code-182/mjpg-streamer/plugins/input_uvc/Makfile)

  1. CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
改为:
  1. CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/jackeyt/libjpeg/include
将:
  1. (CC)(CFLAGS) -o @inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS)
修改为:
  1. (CC)(CFLAGS) -L /home/jackeyt/libjpeg/lib  -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo $(LFLAGS)
注:/home/jackeyt/libjpeg 就是上面移植jpeg库后安装的目录。         

5)编译:
  1. make CC=arm-linux-gnueabi-gcc
在mjpg-streamer生成了:input*.so output*.so 和 mjpg_streamr 可执行文件
如下图所示:

mjpg9.jpg
6)拷贝至开发板上在开发板建立mjpg-streamer安装目录
  1. mkdir  /mjpg-streamer
拷贝
  1. cp /mjpg-streamer mjpg-streamer/

4.4 挂载摄像头  
我们这里使用UVC免驱摄像头进行挂载,至于UVC摄像头,已经很常见了,这里不再赘述了。插入摄像头后,发现:
cam1.jpg

    看来,是内核并未加入该驱动,因此,我们需要修改内核了。

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摄像头:

cam2-1.jpg

此时,USB摄像头已经成功识别出来,我们此时,再次输出命令,查看摄像头挂载至何处?
cam2-2.jpg

可以发现:我们的摄像头已经被成功挂载,并设为video0了。

4)运行mjpg-streamer 切换至mjpg-streamer的目录,使用命令:
  1. ./mjpg_streamer -i "/mjpg/input_uvc.so" -o "/mjpg/output_http.so -w /www"
  或者使用mjpg-streamer官方提供的脚本:
  1. ./start.sh
可以看到执行效果:
cam5.jpg



五 最终效果

在浏览器中输入:开发板相应的地址即可看到视频效果
  1. http://192.168.0.230:8080
如下图所示:
cam3.jpg

cam4.jpg


其次,我们还可以通过上文所提及的:mjpg-streamer-code-182mjpeg-clientbin下的windows或者linux的客户端进行访问:

cam6.png




  





回帖(4)

casy

2017-5-2 21:40:27
厉害厉害,收藏了
举报

telnet

2017-5-18 16:44:34
好帖啊!!必须支持。
举报

可乐丸子

2017-9-3 12:20:28
你移植代码有问题 没有加入-ljpeg到input_uvc的makefile这样不能调用libjpeg吧 会出现不能找到输入设备错误
举报

jackeyt

2017-9-4 09:59:59
引用: 可乐丸子 发表于 2017-9-3 12:20
你移植代码有问题 没有加入-ljpeg到input_uvc的makefile这样不能调用libjpeg吧 会出现不能找到输入设备错误


我是手动指定jpeg库的路径的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分