在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文件
提示找不到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文件,具体错误的原因有待查明。
ls 看一下:
拷贝出我们需要的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