原帖地址:mini2440开发板移植mjpg-streamer 感谢作者,我的备注用紫色字体标注
环境:
内核:linux2.6.32.2
CPU:S3C2440A
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看看是什么意思,根据实际情况修改)
./configure CC=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/目录下)
注:在这里我费了不少事情,由于我jpeg库是下载的最新版,结果出现了(错误2)的情况,即jpeg库与mjpg-streamer对应不上的情况,因此我把jpeg库版本换成了jpeg-6b,然后麻烦问题出现一堆,下面我详细写下我的移植过程:
a,下载jpeg-6b源码
b,下载libtool源码,安装(参考文章1,)
./configure –prefix=/usr(为编译libtool做准备)
make(编译软件包)
make check(这一步选择执行,耗时比较长,只是检测编译是否正确)
make install(安装软件包)
c,进入jpeg-6b源码目录,执行以下步骤,切记!(参考文章2)
cp /usr/share/libtool/config/config.sub . (具体位置会有区别,原文就没有/config这一层文件夹,可具体去查找一下)
cp /usr/share/libtool/config/config.guess .
到这里停止,继续按原文第3条进行安装,若没有这些在make时会提示,./libtool命令无法执行,我从高版本的jpeg库中拷贝一个libtool文件到这里,make可以执行,但是在make install阶段出错
第二步、移植mjpg-streamer
1、下载源码,在https://sourceforge.net/projects/mjpg-streamer/下载的源码(mjpg-streamer-r63)有点老了,最新的版本使用以下命令下载,
svn cohttps://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamermjpg-streamer
注:我的开发板ARM9,linux2.6内核使用r63版本会出现(错误1)的情况,因此换了最新版的mjpg-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、编译:make CC=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 be passed 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: 640×480
[-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” or leave
it up to the driver using the value “auto”
以上是mjpg-streamer的移植全过程,下面说说在这过程可能出现的错误以及解决方法。
1、当编译mjpg-stream-mini2440-read-only时出错
[root@wu mjpg-streamer-mini2440-read-only]# make CC=arm-linux-gcc
arm-linux-gcc -O3 -DLINUX -D_GNU_SOURCE -Wall -c -o mjpg_streamer.o mjpg_streamer.c
mjpg_streamer.c:27:28: fatal error: linux/videodev.h: No such file or directory
compilation terminated.
make: *** [mjpg_streamer.o] 错误 1
[root@wu mjpg-streamer-mini2440-read-only]#
原因:这是因为内核2.6.38和以后的版本已经移除了对 v4l1 的支持,这个东西可能比较老旧了。新的头文件是 video4linux2.h;相比v4l1很多接口都变化
解决办法:可以选择以前低版本内核,或者用新版本的mjpg-streamer,下载地址在开始讲移植mjpg-streamer时讲到。
2、当编译成功,怀着兴奋的心情运行时突然打印出以下错误时
MJPG-streamer [703]: starting application
MJPG Streamer Version: svn rev: 3:154M
MJPG-streamer [703]: MJPG Streamer Version: svn rev: 3:154M
……….
Inconsistency detected by ld.so: dl-deps.c: 622: _dl_map_object_deps: Assertion `nlist > 1′ failed!
…………
或者以下的错误时
VCIOC_CTRL_MAP – Error: Invalid argument
mapping control for LED1 Frequency
UVCIOC_CTRL_MAP – Error: Invalid argument
mapping control for Disable video processing
UVCIOC_CTRL_MAP – Error: Invalid argument
mapping control for Raw bits per pixel
UVCIOC_CTRL_MAP – Error: Invalid argument
o: www-folder-path…: ./www/
o: HTTP TCP port…..: 8080
o: username:password.: disabled
o: commands……….: enabled
Wrong JPEG library version: library is 62, caller expects 80
原因:这是jpeg库文件版本不对应导致的,现在运行使用的是80,但是它实际需要的是62版本,高版本jpeg库与低版本mjpg-streamer冲突。
解决方法:去下载62版本的jpeg库文件,从头开始再编译一次jpeg和mjpeg-streamer。
3、使用摄像头出现如下信息
………………..
Init v4L2 failed !! exit fatal
init_VideoIn failed
………………..
原因:市面上大部分摄像头都是支持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却连320×240都显得不流畅;有拖尾现象(降低采样率效果不明显),再降低画面就有点“不堪入目了”,还需要改进。
感言:装了两天十几个小时,程序编译了三遍,错误1,2,3全部出现,不过最终在chrome和safari中看到了动态图像,没算白费。