s3c2440 ARM9 移植mjpg-streamer
文章内容:
- mjpg-stream介绍
- 硬件环境
- 移植过程
- Linux3.0内核配置
- libjpeg库移植
- mjpg-stream移植
- 测试及调试
一、mjpg-stream介绍
MJPEG 全名为 “Motion Joint Photographic Experts Group”,是一种视频编码格式,
Motion JPEG技术常用与闭合电路的电视摄像机的模拟视频信号“翻译”成视频流,并存储在硬盘上。典型的应用如数字视频记录器等。
mjpg‐streamer是一个开源软件,用于从webcam摄像头采集图像,把它们以流的形式通过基于ip的网络传输到浏览器如Firefox,Cambozola,VLC播放器,Windows的移动设备或者其他拥有浏览器的移动设备.mjpg-streamer 可以通过文件或者是HTTP方式访问linux UVC兼容摄像头。
二、硬件环境
主机环境:ubuntu14.04
目标机:FL2440开发板
主机工具链:gcc-4.6
交叉工具链:/opt/xtools/arm920t/bin/arm-linux-gcc
三、移植过程
-
Linux3.0内核配置
1、配置内核是内核支持UVC格式的摄像头 (其实默认支持UVC,它是标准协议),最后一步时根据自己需要进行选择摄像头配置。cd linux-3.0
make menuconfig
Device Drivers ---> <*> Multimedia support ---> [*] Video capture adapters ---> [*] V4L USB devices ---> <*> USB Video Class (UVC) [*] UVC input events device support
2、重新编译arm板内核,烧入到开发板,启动后将USB摄像头插进开发板,串口右信息自动弹出,即识别成功。
make -j2
~ >: usb 1-1.1: new full speed USB device number 3 using s3c2410-ohci uvcvideo: Found UVC 1.00 device USB 2.0 PC Cam (090c:71b3) input: USB 2.0 PC Cam as /devices/platform/s3c2410-ohci/usb1/1-1/1-1.1/1-1.1:1.0/input/input0
-
jpeg库移植
mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库 ,即需要libjpeg.
(1)jpeg源码包下载(2)解压源码包
tar xvf jpegsrc.v8b.tar.gz
(3)配置源码、编译并安装
cd jpeg-8b
./configure --prefix=/usr/local/src/out_jpeg -host=arm-linux
./configure CC=/opt/xtools/arm920t/bin/arm-linux-gcc --prefix=/usr/local/src/out_jpeg -host=arm-linux
make && make install(4)安装完成后,上面配置的/usr/local/src/out_jpeg 文件夹中便出现了bin、include、lib、share。其中include、lib便是mjpg-stream需要的。
(5)拷贝上述文件夹lib,即jpeg库到根文件系统中。
cp -ri /usr/local/src/out_jpeg/lib/* …/rootfs/lib
-
mjpg-stream移植
(1)下载最新板mjpg-streamer源码至/usr/local/src/。cd /usr/local/src/
svn checkout https://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code文件夹包含
doc
mjpg-streamer —>提供执行程序和哥哥输入输出设备组件
udp_client
mjpeg-client —>分别有 linux和windows 的客户端
mjpg-streamer-experimental
uvc-streamer —>提供了 uvc-streamer的可执行目录(2)进入目录mjpg-streamer并修改源码
1、修改源码 顶层的Makefile及plugins文件夹里面所有子层的Makefile中的CC参数为arm-linux-gcc,即将所有“CC = gcc”改为“CC = /opt/xtools/arm920t/bin/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.c v4l2uvc.lo jpegutils.lo dynctrl.lo ($LFLAGS)为
(CC)(CFLAGS) -L /usr/local/src/out_jpeg/lib -o @inputuvc.c v4l2uvc.lo jpegutils.lo dynctrl.lo ($LFLAGS)
(注:/usr/local/src/out_jpeg/lib 就是上面移植jpeg库后安装的目录,根据自己设置的目录来修改)3、编译make,在mjpg-stream目录下生成了 input*.so、 output*.so 和 mjpg_streamer 可执行文件
4、在开发板挂载的ubuntu文件系统目录中(本人为…/rootfs)建立mjpg-streamer安装目录,再将源码目录mjpg-stream整个拷贝到/root/rootfs/rootfs/mjpg-streamer目录下,然后就可以测试啦mkdir /…/rootfs/mjpg-streamer
cp -ri mjpg-stream/* /root/rootfs/rootfs/mjpg-streamer
四、测试及调试
启动arm板,板子应设置好环境变量,让arm板通过tftp下载内核和挂载好ubuntu中的自制作文件系统。
启动后,插进USB摄像头,进入板子的mjpg-streamer 目录,
执行 ./start.sh;
若没有出现错误,则在PC机打开一个网页,输入http://(ip):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两种格式。
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);
}
...........
}
将上面第4行中
format = V4L2_PIX_FMT_MJPEG
改为:
format = V4L2_PIX_FMT_YUYV