详解移植mjpg_streamer到arm板

来源:互联网 发布:淘宝店铺转让安全吗 编辑:程序博客网 时间:2024/05/18 03:07
介绍:
Mjpg‐streamer是一个开源软件,用于从webcam摄像头采集图像,把它们以流的形式通过基于ip的网络传输到浏览器如Firefox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备.
mjpg-streamer 可以通过文件或者是HTTP方式访问linuxUVC兼容摄像头。
—————————————————————————————————————————————————

本文作一个移植记录。
前天买了个优迈Q5USB摄像头,准备用来做毕业设计,需要移植mjpg_streamer。昨天在移植的时候折腾了一下,现在已成功移植到九鼎x210板子(S5PV210)上,能够在ubuntu下的火狐浏览器打开摄像头采集画面,下面开始记录移植过程。

—————————————————————————————————————————————
一、环境
主机环境:ubuntu14.04
目标机:九鼎创展科技的x210开发板(S5PV210)
主机工具链:gcc-4.8.2
交叉工具链:arm-none-linux-gnueabi-gcc-4.4.1
用一个软连接“arm-linux-gcc”指向它,下面有参数会用到它
____________________________________________________________________________________________________________

二、移植过程 
1、配置内核是内核支持UVC格式的摄像头 (其实默认支持UVC,它是标准协议),最后一步时根据自己需要进行选择摄像头配置。

DeviceDrivers  --->

               <*>Multimediasupport  --->

                         [*]   Videocaptureadapters  --->

                                [*]   V4LUSBdevices  ---> 
                                         <*>   USBVideo Class (UVC)

                                          [*]     UVCinput events device support       

2、重新编译arm板的内核 ,烧录到板子,启动后将USB摄像头插进板子串口有信息自动弹出时,即识别成功。
make -j2

3、mjpg-stream的移植 
mjpg-stream的资料可以在下面这个网址查看(全英文):http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Page 
mjpg-stream最新版下载网址是:http://mjpg-streamer.svn.sourceforge.net/viewvc/mjpg-streamer/ ,
(进去后,点右上的“Download Snapshot”下载最新版的mjpg-streamer-code-182,因为旧版编译时会出现缺少一个头文件的错误)
mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库 ,即需要libjpeg
第一步:jpeg库的移植 
1)jpeg源码包通过下面这个网址下载 
http://www.ijg.org/files/jpegsrc.v8b.tar.gz 
2)解压源码包 
tar xvf jpegsrc.v8b.tar.gz 
3)配置源码 ,下面的配置很重要,自行定义jpeg安装目录(得先创建那文件夹),并使用交叉工具链编译jpeg库(要不然会出现编译mjpg_streamer的input_uvc.o时找不到兼容的ljpeg错误!)
cd jpeg-8b ,在命令行分别输入下面命令配置:
./configure --prefix=/usr/local/src/out_jpeg -host=arm-none-linux-gnueabi 
./configure CC=arm-linux-gcc --prefix=/usr/local/src/out_jpeg-host=arm-none-linux-gnueabi
4)编译 
make 
5)安装 ,执行makeinstall 命令后,在上面配置的/usr/local/src/out_jpeg文件夹中便出现了一些文件夹,包括bin、includelib、share,红色这两个文件夹便是mjpg_streamer需要的。
6)拷贝上面的lib文件夹即jpeg库到文件系统中 
cp /usr/local/src/out_jpeg/lib /root/rootfs/rootfs/lib -rf
(/root/rootfs/rootfs此目录为自己的文件系统目录,arm板是挂载ubuntu中此目录作为根文件系统的)

第二步、移植mjpg-streamer 
1、将下载最新版本的源码解压至/usr/local/src/,目录mjpg-streamer-code-182里内容如下:
doc 
mjpg-streamer 
udp_client 
mjpeg-client
mjpg-streamer-experimental 
uvc-streamer 
————————部分说明:
mjpg-streamer :目录下提供了 的执行程序和各个输入输出设备组件 
uvc-streamer : 目录下提供了uvc-streamer的可执行目录 
mjpeg-client:: 分别有 linux和windows的客户端 
————————
2、进入目录 
cd mjpg-streamer 
3、(1)修改源码 顶层的Makefile及plugins文件夹里面所有子层的Makefile中的CC参数为arm-linux-gcc,即将所有“CC= gcc”改为“CC =arm-linux-gcc”,哈哈,不得不花上几分钟去修改。
(2)进入/plugins/input_uvc/Makfile, 
修改 
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared-fPIC 
为 
CFLAGS += -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC-I /usr/local/src/out_jpeg/include 
修改 
(CC)(CFLAGS) -o@inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS) 
为 
(CC)(CFLAGS) -L /usr/local/src/out_jpeg/lib-o@inputuvc.cv4l2uvc.lojpegutils.lodynctrl.lo(LFLAGS) 
(注:/usr/local/src/out_jpeg/lib就是上面移植jpeg库后安装的目录,根据自己设置的目录来修改) 

这样,mjpg_streamer就和jpeg库绑定了。

4、编译:make (make clean为清除编译)
 在mjpg-streamer目录下生成了 input*.so、output*.so 和 mjpg_streamer 可执行文件 

5、在开发板挂载的ubuntu文件系统目录中(本人为/root/rootfs/rootfs)建立mjpg-streamer安装目录 
mkdir /root/rootfs/rootfs/mjpg-streamer 
再将源码目录mjpg-stream整个拷贝到/root/rootfs/rootfs/mjpg-streamer目录下,然后就可以测试啦 
cp mjpg-stream /root/rootfs/rootfs/mjpg-streamer-rf

6、测试
(启动arm板,板子应设置好环境变量,让arm板通过tftp下载内核和挂载好ubuntu中的自制作文件系统)
启动后,插进USB摄像头,进入板子的mjpg-streamer 目录,
执行 ./start.sh
若没有出现错误,则在PC机打开一个网页,输入http://192.168.1.20:8080/?action=stream就可以看到图像。 
(ip为arm板的ip)

————————————————移植完毕————————————————————————

若出现下面错误:
Unable to set format: Invalid argument
 Init v4L2 failed !! exit fatal
 i: init_VideoIn failed


错误原因:
市面上大部分摄像头都是支持YUV的,而不是JPEG的。mjpg-stream支持JPEG和YUV两种格式。

解决方法:

[fire@fire mjpg-streamer]$cdmjpg-streamer/plugins/input_uvc/
[fire@fire input_uvc]$vi input_uvc.c

int input_init(input_parameter *param, int id){    char *dev = "/dev/video0", *s;    int width = 640, height = 480, fps = -1, format = V4L2_PIX_FMT_MJPEG, i;        if(pthread_mutex_init(&cams[id].controls_mutex, NULL) != 0) {        IPRINT("could not initialize mutex variable\n");        exit(EXIT_FAILURE);    }.......................

将上面红色代码改为:format =V4L2_PIX_FMT_YUYV

以上就设置了默认的图像格式,重新在顶层把模块编译,再次cpmjpg-stream /root/rootfs/rootfs/mjpg-streamer -rf,arm板重启后就成功了!


1 0
原创粉丝点击