介绍:
Mjpg‐streamer是一个开源软件,用于从webcam摄像头采集图像,把它们以流的形式通过基于ip的网络传输到浏览器如Firefox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备.
mjpg
-
streamer
可以通过文件或者是HTTP方式访问linux UVC兼容摄像头。
—————————————————————————————————————————————————
本文作一个移植记录。
前天买了个优迈Q5 USB摄像头,准备用来做毕业设计,需要移植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,它是标准协议),
最后一步时根据自己需要进行选择摄像头配置。
Device Drivers --->
<*> Multimedia support --->
[*] Video capture adapters --->
[*] V4L USB devices --->
<*> USB Video Class (UVC)
[*] UVC input events device support
2、重新编译arm板的内核 ,烧录到板子,启动后
将USB摄像头插进板子串口有信息自动弹出时,即识别成功。
make -j2
(进去后,点右上的“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)安装 ,执行
make install
命令后,在上面配置的
/usr/local/src/out_jpeg
文件夹中便出现了一些文件夹,包括bin、include、lib、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
;
(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]$ cd mjpg-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
以上就设置了默认的图像格式,重新在顶层把模块编译,再次cp mjpg-stream /root/rootfs/rootfs/mjpg-streamer -rf ,arm板重启后就成功了!