现在的位置: 首页 > 综合 > 正文

嵌入式移植mjpg-streamer成功

2013年12月08日 ⁄ 综合 ⁄ 共 4691字 ⁄ 字号 评论关闭

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/目录下)



第二步、移植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、编译: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:
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都显得不流畅;有拖尾现象(降低采样率效果不明显),再降低画面就有点“不堪入目了”,还需要改进。

抱歉!评论已关闭.