机环境 :Ubuntu 10.10
目标机 :FS2410(S3C2410)
主机工具链 :gcc-4.4.5
交叉工具链 :arm-none-linux-gnueabi-gcc-4.3.2
摄像头 :ZC301
二、移植过程
1、配置内核是内核支持芯片为ZC301的摄像头
Make menuconfig
Device Drivers --->
<*> Multimedia support --->
<*> Video For Linux
[*] Enable Video For Linux API 1 (DEPRECATED) (NEW)
[*] Video capture adapters (NEW) --->
[*] V4L USB devices (NEW) --->
<*> USB Video Class (UVC)
[*] UVC input events device support (NEW)
<*> USB ZC0301[P] webcam support (DEPRECATED)
2、重新编译内核
make zImage
通过上面两个步骤就可以驱动我们的摄像头了。但是这个驱动是基于V4l2的。以前基于V4L的一些上层应用就不能用了,或需要做大量的修改!这里我们要实现网络视频的功能,以前都是用servfox这个网络视频服务器,但是这个服务器就是基于V4L的,我们如果想用的话就得对servfox的源码进行修改。这里我们选用另外一种方案mjpg-stream。
3、mjpg-stream的移植
关于mjpg-stream的资料大家可以在下面这个网址查看:
http://sourceforge.net/apps/mediawiki/mjpg-streamer/index.php?title=Main_Page
mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库
(1)jpeg库的移植
1)jpeg源码包通过下面这个网址下载
http://www.ijg.org/files/jpegsrc.v8b.tar.gz
2)解压源码包
tar xvf jpegsrc.v8b.tar.gz
3)配置源码
cd jpeg-8b
./configure --prefix=/home/linux/s3c2410-2.6.35/video/jpeg --host=arm-none-linux-gnueabi
4)编译
make
5)安装
make install
6)拷贝库到文件系统中
cp //home/linux/s3c2410-2.6.35/video/jpeg /lib/libjpeg.so.8 /source/rootfs/lib
(2)mjpg-stream的移植
1)mjpg-stream源码包通过下面这个网址下载
http://sourceforge.net/projects/mjpg-streamer/
2)解压源码
tar xvf mjpg-streamer-r63.tar.gz
3)修改源码
cd mjpg-streamer-r63
修改顶层makefile及plugins目录中的各级makefile将所有
CC=gcc
修改为
CC=arm-none-linux-gnueabi-gcc
修改plugins/input_uvc/Makfile
修改
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
为
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/linux/s3c2410-2.6.35/video/jpeg/include
修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
为
$(CC) $(CFLAGS) -ljpeg -L/home/linux/s3c2410-2.6.35/video/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
jpeg_utils.c:27: fatal error: jpeglib.h: No such file or directory
4)编译
make
5)测试
mkdir /source/rootfs/mjpg
cp *.so /source/rootfs/mjpg
cp mjpg-stream /source/rootfs/bin
打开开开发板运行
mjpg_streamer -i "/mjpg/input_uvc.so" -o "/mjpg/output_http.so -w /www"
在源码目录下有start.sh,这个脚本里有一些mjpg-stream的使用方法及说明
打开一个网页输入下面地址就能够看到一个视频(开发板的IP为192.168.1.202):
http://192.168.1.202:8080/?action=stream
打开一个网页输入下面地址就能够看到一个静态图片:
http://192.168.1.202:8080/?action=snapshot
6)在mjpg源码下有一个www的目录,这个一个网络使用mjpg的实例,结合web服务器(boa)可以实现一些其他相关功能
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2012-02/54797p4.htm
mjpg-stream的移植需要jpeg的库,所以我们先移植jpeg的库
(1)jpeg库的移植
1)jpeg源码包通过下面这个网址下载
http://www.ijg.org/files/jpegsrc.v8b.tar.gz
2)解压源码包
tar xvf jpegsrc.v8b.tar.gz
3)配置源码
cd jpeg-8b
./configure --prefix=/home/6410/video/jpeg --host=arm-linux
4)编译
make
5)安装
make install
6)拷贝libjpeg.s0.8库到开发板文件系统lib下中
2)mjpg-stream的移植
1)mjpg-stream源码包通过下面这个网址下载
http://sourceforge.net/projects/mjpg-streamer/
2)解压源码
tar xvf mjpg-streamer-r63.tar.gz
3)修改源码
cd mjpg-streamer-r63
修改顶层makefile及plugins目录中的各级makefile将所有
CC=gcc
修改为
CC=arm-none-linux-gnueabi-gcc
修改plugins/input_uvc/Makfile
修改
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
为
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I/home/6410/video/jpeg/include
修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
为
$(CC) $(CFLAGS) -ljpeg -L/home/6410/video/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
4)编译
make
5)测试
在开发板上mkdir /mjpeg
拷贝*.so到开发板的mjpeg目录下,mjpg_streamer到开发板的bin下并改变权限
打开开开发板运行
mjpg_streamer -i "/mjpeg/input_uvc.so -d /dev/video2" -o "/mjpeg/output_http.so"
用火狐浏览器打开一个网页输入下面地址就能够看到一个视频(开发板的IP为222.22.253.88):
http://222.22.253.88:8080/?action=stream
打开一个网页输入下面地址就能够看到一个静态图片:
http://222.22.253.88:8080/?action=snapshot
平台: xbox下的ubuntu10.10、交叉编译工具:arm-linux-gcc 4.3.3.开发板xc2440 内核linux.2.6.37.4.摄像头Z301P
在arm9 视频采集图像中我想到很多方案。在前面的一大推的努力没成功后,我在网上无线发现一个 开源的软件mjpg-streamer也可以采集图像。首先我下载一个SDL的库。apt-get install sdl.因为下面会用到这个。然后下载mjpg-streamer这个网上都有的,解压后,你会发现有三个目录。分别对应的是mjpeg-client,mjpg-streamer,uvc-streamer。首先我进入mjpeg-client中然后到bin目录你回发先下面一个是对应linux-i386。还有一个win32-upx,进入win32中会有一个viewer.exe,这个是在windows下直接可以运行的客户端。linux-i386的还没使用过。然后跳出进入mipg-streamer目录下。make编译下。如果没有错误的话会生成
我的开发板ip是192.168.1.10
然后输入命令mjpg-streamer -i “、lib/input_uvc.so” -o "/lib/output_http.so -w 192.168.1.10:8080"
8080是对应端口号。然后提示
<form id="form1" name="form1" method="get" action="/cgi-bin/leds.cgi">
<p>
<label>
<input type="radio" name="type" value="1" />
开灯 </label>
<br />
<label>
<input type="radio" name="type" value="0" checked/>
关灯</label>
<br />
<label>
<input type="radio" name="type" value="10" />
查看LED1状态 </label>
</p>
<p>
<label>
<input type="submit" name="Submit" value="OK!" />
</label>
</p>
</form>
</div>
<label>
if(led_fd==-1)
{
perror("open tiny6410-led device failed\n");
printf("open tiny6410-led device failed\n");
exit(1);
}
else
{
//printf("open tiny6410-led device success!\n");
}
/*LED1*/
if(fifo_value[0]==0)
{
printf("CGI ioctl is ok\n");
else
printf("CGI ioctl is wrong\n");
if(fifo_value[0]==1)
{
printf("CGI ioctl is ok\n");
else
printf("CGI ioctl is wrong\n");
if(fifo_value[0]==10)
{
_itoa(arg,s,2);
//printf("s=%s\n",s);
n=strlen(s);
//printf("n=%d\n",n);
//printf("s[0]=%c",s[0]);
if(s[0]=='0')
printf("led 1: ON\n");
else if(s[0]=='1')
printf("led 1: OFF\n");
}
效果图: