Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60888
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 101
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-07 19:38
文章分类

全部博文(25)

文章存档

2014年(25)

我的朋友

分类: 嵌入式

2014-06-09 21:37:44



移植mjpg-streamer
2012-05-01 21:32
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、从下载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/目录下)


第二步、移植mjpg-streamer
1、下载源码,在下载的源码(mjpg-streamer-r63)有点老了,最新的版本使用以下命令下载,
svn co
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机打开一个网页,输入就可以看到图像。
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: 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" 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却连320x240都显得不流畅;有拖尾现象(降低采样率效果不明显),再降低画面就有点“不堪入目了”,还需要改进。

阅读(1559) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~