MJPG-Streamer及使用---fwqlzz love is for ever

在zedboard上移植和搭建嵌入式网络摄像机mjpg-streamer。具体步骤如下:

来自:http://blog.csdn.net/xzyiverson/article/details/13741451

1.安装libtool工具

1.1 下载libtool工具libtool-2.2.10.tar.gzhttp://mirrors.ustc.edu.cn/gnu/libtool/

1.2  tar -xvzf libtool-2.2.10.tar.gz -C /home/xzy/sdb1/JPEG/

1.3  进入解压后的目录,执行./configure

1.4  make

1.5  make install


2.JPEG编码库移植

2.1 下载JPEG源码包,选择jpegsrc.v6b.tar.gz    http://www.ijg.org/files/

2.2  解压  tar jpegsrc.v6b.tar.gz  -C /home/xzy/sdb1/JPEG/

2.3  进入解压后的目录,将刚刚libtool-2.2.10目录下的libltdl/config/config.sub和config.guess拷贝至此目录中。

2.4  配置./configure CC=arm-xilinx-linux-gnueabi-gcc  --host=arm-unknown-linux 

 –prefix=/home/xzy/sdb1/JPEG/jpeg-6b  --enable-shared   --enable-static

2.5  make

2.6  进入安装路径,创建如下目录   mkdir bin lib include man man/man1,我的安装目录就在这个目录,注意必须要创建这些目录,不然是不然make install的(试过了。)

2.7  make install,然后就ok了。


3.mjpg-streamer移植

3.1 下载源码http://sourceforge.net/projects/mjpg-streamer/files/mjpg-streamer/Sourcecode/

3.2     解压tar -xvzf mjpg-streamer-r63.tar.gz  -C  /home/xzy/sdb1/JPEG/


3.3 进入解压后的目录,修改./plugins/input_uvc目录下的Makefile文件

修改1:将CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC改为
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/xzy/sdb1/JPEG/jpeg-6b/include

修改2:
将$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo改为
$(CC) $(CFLAGS) -ljpeg –L /home/xzy/sdb1/JPEG/jpeg-6b/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

3.4  编译make CC=arm-xilinx-linux-gnueabi-gcc,出错

MJPG-Streamer及使用---fwqlzz love is for ever_第1张图片

提示找不到linux/videodev.h,原因是在2.6.38内核以后移除了对v411的支持,新的头文件是linux/videodev2.h

修改mjpg-streamer-r63/plugins/input_uvc/v4l2uvc.h

修改mjpg-streamer-r63/plugins/input_uvc/uvcvideo.h

修改mjpg-streamer-r63/plugins/input_uvc/input_uvc.c

修改mjpg-streamer-r63/mjpg_streamer.c

修改mjpg-streamer-r63/plugins/output_file/output_file.c

修改mjpg-streamer-r63/plugins/output_http/output_http.c

修改mjpg-streamer-r63/plugins/input_testpicture/input_testpicture.c

修改mjpg-streamer-r63/plugins/output_autofocus/output_autofocus.c

修改mjpg-streamer-r63/plugins/input_gspcav1/spcav4l.h

修改mjpg-streamer-r63目录下的Makefile文件,将$(CC) $(CFLAGS) $(LFLAGS) $(OBJECTS) -o $(APP_BINARY)改为$(CC) $(CFLAGS) $(OBJECTS) $(LFLAGS) -o $(APP_BINARY)

mjpg-streamer-r63/目录下执行make CC=arm-xilinx-linux-gnueabi-gcc

编译还是出错,如下图,但是已经生成了一些lib文件,具体错误的原因有待查明。

MJPG-Streamer及使用---fwqlzz love is for ever_第2张图片

ls 看一下:

MJPG-Streamer及使用---fwqlzz love is for ever_第3张图片

拷贝出我们需要的mjpg_streamer,output_http.so,input_uvc.so,已经libjpg的一些库,有如下



4测试

启动demo系统,拷贝那些lib到/usr/lib下面去,mkdir /www/camwww这个目录,插好网线和usb摄像头。

运行./mjpg_streamer -i "/usr/lib/input_uvc.so -yuv" -o  "/usr/lib/output_http.so -p 8080 -w /www/camwww"

我的摄像头那里必须要有-yuv,不然报错

_http.so -p 8080 -w /www/camwww"
MJPG-streamer [726]: starting application
MJPG Streamer Version.: 2.0
MJPG-streamer [726]: MJPG Streamer Version.: 2.0

 i: Using V4L2 device.: /dev/video0
MJPG-streamer [726]: Using V4L2 device.: /dev/video0

 i: Desired Resolution: 640 x 480
MJPG-streamer [726]: Desired Resolution: 640 x 480

 i: Frames Per Second.: 5
MJPG-streamer [726]: Frames Per Second.: 5

 i: Format............: MJPEG
MJPG-streamer [726]: Format............: MJPEG

Unable to set format: Invalid argument
 Init v4L2 failed !! exit fatal 
 i: init_VideoIn failed
MJPG-streamer [726]: init_VideoIn failed


还有需要注意的是:最好直接把摄像头插在usb-otg上,我插在没有外接电源的HUB不能成功 ,不然报错

Unable to start capture: No space left on device(设备空间不足)

i: Error grabbing frames





Mjpg‐streamer是一个开源软件,用于从webcam摄像头采集图像,把它们以流的形式通过基于ip的网络传输到浏览器如Firefox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备;关于它的介绍网上有一大堆,读者可自行了解;网上关于它的移植也很多,下面给出移植的过程与在编译过程中出现的一些问题与解决方法。
在移植Mjpg-streamer之前必须移植好libjpeg;因为在mjpg-streamer源码包下的README文件中有下面一句话:
* the input plugin "input_uvc.so"depends on libjpeg, make sure it is installed.
下面开始移植的旅途
一、环境
主机环境:fedora 15
目标机:友善之臂公司的mini2440开发板
主机工具链:gcc-4.6.3
交叉工具链:arm-none-linux-gnueabi-gcc-4.5.2(由于名字太长书写费时间,用一个软连接“arm-linux-gcc”指向它)
二、移植过程
第一步jpeg库的移植
1、从http://www.ijg.org/files/下载jpeg源码包;
2、解压,进入其目录,
     cd /home/wu/jpeg-6b
3、配置源码,(具体配置项可以运行命令./configure--help看看是什么意思,根据实际情况修改)

  ./configureCC=arm-linux-gcc --host=arm-unknown-linux --prefix=/home/wu/jpeg-6b/jpeg--enable-shared --enable-static
其中/home/wu/jpeg-6b/jpeg是编译后安装的目录,根据实际情况修改
4、编译:make
5、安装:make install
6、拷贝库文件到开发板文件系统
    将/home/wu/jpeg-6b/jpeg/lib/目录下全部文件拷贝到开发板文件系统/nfs/rootfs/usr/local/mjpg-streamer下(此目录为mjpg-streamer在开发板的安装目录,当然你也可以把它放在开发板的/lib/目录下)


第二步、移植mjpg-streamer
1、下载源码,在https://sourceforge.net/projects/mjpg-streamer/下载的源码(mjpg-streamer-r63)有点老了,最新的版本使用以下命令下载,
svn cohttps://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamermjpg-streamer
2、进入其目录
cd/home/wu/mjpg-streamer/mjpg-streamer/
3、修改源码
修改plugins/input_uvc/Makfile,
修改
CFLAGS = -O2 -DLINUX -D_GNU_SOURCE-Wall -shared -fPIC

CFLAGS = -O2 -DLINUX -D_GNU_SOURCE-Wall -shared -fPIC-I/home/wu/jpeg-6b/jpeg/include

修改
$(CC) $(CFLAGS) -ljpeg -o $@input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo

$(CC) $(CFLAGS) -ljpeg -L/home/wu/jpeg-6b/jpeg/lib-o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
注:/home/wu/jpeg-6b/jpeg就是上面移植jpeg库后安装的目录
4、编译:makeCC=arm-linux-gcc
5、在开发板建立mjpg-streamer安装目录
mkdir/nfs/rootfs/usr/local/mjpg-streamer
cp *.so/nfs/rootfs/usr/local/mjpg-streamer
cp mjpg-stream/nfs/rootfs/usr/local/mjpg-streamer
将源码目录中的start.sh和目录www拷贝到/nfs/rootfs/mjpg-streamer目录下,然后就可以测试啦
6、测试:
修改start.sh文件,然后运行start.sh;在PC机打开一个网页,输入http://192.168.1.1:8080/?action=stream就可以看到图像。
7、获得帮助
获得帮助的方法在start.sh里有说明,以下举一个例子,运行./mjpg_streamer--help它会打印出以下帮助,可根据需要设置参数
The following parameters can bepassed to this plugin:
 [-d | --device].......: video device to open (your camera)
 [-r | --resolution]...: the resolution of the video device,
                         can be one of the following strings

                        QSIF QCIF CGA QVGA CIF VGA
                         SVGA XGA SXGA
                         or a custom value like the following
                         example: 640x480
 [-f | --fps]..........: frames per second
 [-y | --yuv]..........: enable YUYV format and disable MJPEG mode
 [-q | --quality]......: JPEG compression quality in percent
                         (activates YUYV format, disables MJPEG)
 [-m |--minimum_size ].: drop frames smaller then this limit,useful
                         if the webcam produces small-sized garbage frames
                         may happen under low light conditions
 [-n | --no_dynctrl]...: do not initalize dynctrls of Linux-UVC driver
 [-l | --led]..........: switch the LED "on", "off", let it "blink" orleave
                         it up to the driver using the value "auto"

以上是mjpg-streamer的移植全过程,下面说说在这过程可能出现的错误以及解决方法。
1、当编译mjpg-stream-mini2440-read-only时出错
[root@wumjpg-streamer-mini2440-read-only]# makeCC=arm-linux-gcc
arm-linux-gcc -O3 -DLINUX-D_GNU_SOURCE-Wall    -c -omjpg_streamer.o mjpg_streamer.c
mjpg_streamer.c:27:28: fatalerror: linux/videodev.h: No such file or directory
compilation terminated.

make: *** [mjpg_streamer.o] 错误1
[root@wumjpg-streamer-mini2440-read-only]#
原因:这是因为内核2.6.38和以后的版本已经移除了对 v4l1的支持,这个东西可能比较老旧了。新的头文件是 video4linux2.h;相比v4l1很多接口都变化
解决办法:可以选择以前低版本内核,或者用新版本的mjpg-streamer,下载地址在开始讲移植mjpg-streamer时讲到。

2、当编译成功,怀着兴奋的心情运行时突然打印出以下错误时
MJPG-streamer [703]: startingapplication
MJPG Streamer Version: svn rev:3:154M
MJPG-streamer [703]: MJPG StreamerVersion: svn rev: 3:154M
..........
Inconsistencydetected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion`nlist > 1' failed!
............
或者以下的错误时
VCIOC_CTRL_MAP - Error: Invalidargument
mapping control for LED1Frequency
UVCIOC_CTRL_MAP - Error: Invalidargument
mapping control for Disable videoprocessing
UVCIOC_CTRL_MAP - Error: Invalidargument
mapping control for Raw bits perpixel

UVCIOC_CTRL_MAP - Error: Invalidargument
 o:www-folder-path...: ./www/
 o: HTTP TCPport.....: 8080
 o:username:password.: disabled
 o:commands..........: enabled
Wrong JPEG libraryversion: library is 62, caller expects 80
原因:这是jpeg库文件版本不对应导致的,现在运行使用的是80,但是它实际需要的是62版本,高版本jpeg库与低版本mjpg-streamer冲突。
解决方法:去下载62版本的jpeg库文件,从头开始再编译一次jpeg和mjpeg-streamer。

3、使用摄像头出现如下信息
....................
 Init v4L2failed !! exit fatal 
init_VideoInfailed
....................
原因:市面上大部分摄像头都是支持YUV的,而不是JPEG的。
解决方法:由于mjpg-stream支持JPEG和YUV两种格式,所以只需修改start.sh,在输入中加入” - y“
假如原来是./mjpg_streamer -i"./input_uvc.so " -o "./output_http.so -w ./www",则改为
./mjpg_streamer -i"./input_uvc.so -y" -o "./output_http.so -w./www"即可。

总结:经过一轮的谷歌+百度后终于可以在firefox看了摄像头采集的图像,但仍有一些不尽人意的是在PC机能达到640X320;在mini2440却连320x240都显得不流畅;有拖尾现象(降低采样率效果不明显),再降低画面就有点“不堪入目了”,还需要改进。


一、获取源码及编译

$sudo apt-get install libjpeg-dev subversion imagemagick 
$ svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code 
$ cd mjpg-streamer/mjpg-streamer 
$ make clean all 


二、运行

$ export LD_LIBRARY_PATH=.
$ ./mjpg_streamer -i "input_uvc.so" -o "output_http.so -w ./www"
想要查看视频,请在web页面中输入地址:http://127.0.0.1:8080


三、安装

如果需要安装该应用,执行以下指令:
sudo make DESTDIR=/usr install


四、可使用的分辨率

YUV2
1600×1200 5 fps
960×720 10 fps
800×600 25 fps
640×480 30 fps
352×288 30 fps
320×240 30 fps
176×144 30 fps
160×120 30 fps
MJPG
960×720 15 fps
800×600 30 fps
640×480 30 fps
352×288 30 fps
320×240 30 fps
176×144 30 fps
160×120 30 fps
示例一:
$ ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -y -r 1600x1200" -o "output_http.so -w ./www"
示例二:
$ ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -f 15 -r 960x720" -o "output_http.so -w ./www"


五、创建启动的脚本

#!/bin/bash
RESOLUTION="960x720"
FRAMERATE="15"
MJPG_WEB_ROOT="/home/philipp/Downloads/mjpg-streamer/mjpg-streamer/www"
PORT="8081"

mjpg_streamer -i "input_uvc.so -d /dev/video0 -f $FRAME_RATE -r $RESOLUTION" -o "output_http.so -w $MJPG_WEB_ROOT -p $PORT"


六、其它

1.http认证

$ ./mjpg_streamer -i "input_uvc.so -d /dev/video1 -f 15 -r 800x600" -o "output_http.so -w ./www -c uSeRnAmE:s3cure-pAssw0rd"

2.mplayer播放

$ mplayer -fps 30 -demuxer lavf "http://127.0.0.1:8080/?action=stream&ignored.mjpg"


Ubuntu Linux编译运行mjpg-streamer步骤:http://www.linuxdiyf.com/linux/7742.html

Ubuntu下mjpg-streamer安装:http://www.linuxdiyf.com/linux/4050.html


你可能感兴趣的:(MJPG-Streamer及使用---fwqlzz love is for ever)