实现流程:
1、USB摄像头驱动移植:通过配置linux内核源码进行选择(USB主机驱动、摄像头驱动以及视频数据接口V4L2)
2、移植jpeg库
3、搭建boa服务器
4、移植视频流媒体服务器---> mjpeg-streamer
一、USB摄像头驱动移植
使用gec210开发板自带的内核,或者按以下步骤重新配置驱动
步骤:
1、usb驱动添加
Make menuconfig
Device support
Scsi device support
* scsi disk support
* scsi generic support
* scsi media changer support
x -> Device support
x -> USB support
x -> USB Mass Storage support
2、添加驱动(video)
Make menuconfig
Device Drivers --->
<*> Multimedia support --->
<*> Video For Linux
[*] Enable VideoFor Linux API 1 (DEPRECATED) (NEW)
[*] Video captureadapters (NEW) --->
[*] V4L USB devices(NEW) --->
<*> USB VideoClass (UVC)
[*] UVC inputevents device support (NEW)
<*> USB ZC0301[P] webcam support (DEPRECATED)
插入U盘检测时才需要---> Mount -t vfat /dev/sda1/mnt二、移植jpeg库
步骤:
1、jpeg源码包通过下面这个网址下载:http://www.ijg.org/files/jpegsrc.v9b.tar.gz
2、·在PC端中解压源码包 tar xvf jpegsrc.v9b.tar.gz
3、配置源码 cd jpeg-9b
./configure --prefix=/home/chile/jpeg--host=arm-none-linux-gnueabi
根据自己的创建的目录修改“/home/chile/jpeg”
4、编译 make
5、安装 make install
6、拷贝libjpeg.so.9动态库文件到开发板的/lib中
三、搭建boa服务器介绍:
典型的嵌入式Web服务器有Boa (www.boa.org)和thttpd (http://www.acme.com/software/thttpd/)等,它们和Apache等高性能的Web服务器主要的区别在于它们一般是单进程服务器,只有在完成一个用户请求后才能响应另一个用户的请求,而无法并发响应,但这在嵌入式设备的应用场合里已经足够了。
Boa是一个非常小巧的Web服务器,可执行代码只有约60KB。它是一个单任务Web服务器,只能依次完成用户的请求,而不会fork出新的进程来处理并发连接请求。但Boa支持CGI,能够为CGI程序fork出一个进程来执行。Boa的设计目标是速度和安全,在其站点公布的性能测试中,Boa的性能要好于Apache服务器。
步骤:
1、编译BOA源码
从www.boa.org下载Boa源码,当前最新版本为0.94.13,将其解压并进入源码目录的src子目录
$ sudo tar -vxf boa-0.94.13.tar.tar
$ cd boa-0.94.13/src
生成Makefile文件
$sudo ./configure
修改Makefile文件,找到CC=gcc,将其改成CC = arm-linux-gcc,再找到CPP = gcc –E,将其改成CPP = arm-linux-gcc –E,并保存退出。
然后运行make进行编译,得到的可执行程序为boa,将调试信息剥去,得到的最后程序只有约60KB大小。
$ make
make过程中,出现一个error
arm-linux-gcc -g -O2 -pipe -Wall -I. -c -o util.o util.c
util.c: In function 'get_commonlog_time':
util.c:100:1: error: pasting "t" and "->" does not give a valid preprocessing token
make: *** [util.o] Error 1
解决方法:
修改 src/compat.h
找到
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改成
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
然后
$ make clean
$ make
make成功后,生成boa可执行文件。
$file boa
ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux2.6.27, not stripped
删除可执行文件BOA的调试信息。
$ arm-linux-strip boa
2、修改boa.conf文件(这一步很重要,仔细修改)
配置Boa,使其能够支持CGI程序的执行。Boa需要在/etc目录下建立一个boa目录,里面放入Boa的主要配置文件boa.conf。
在Boa源码目录下已有一个示例boa.conf,可以在其基础上进行修改, /etc/boa/boa.conf
需要修改的地方:
1、 Group nogroup 改为 Group 0(这一步不改也行)
2、 #ServerNamewww…….. 改为 Servername192.168.1.111 (即你的开发板IP)
3、DocumentRoot /var/www 改为 DocumentRoot /www
4、ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 改为 ScriptAlias /cgi-bin/ /www/cgi-bin/3、构建BOA环境
1、拷贝boa可执行文件到根文件系统的/bin目录下;在/etc目录下建boa目录,并将boa.conf到/etc/boa目录下。
2、创建日志文件所在目录/var/log/boa。
3、将mime.types拷贝到根文件系统/etc目录下。mime.types文件可以从宿主机linux系统中的/etc目录中拷贝到根文件文件系统的/etc目录下。
4、在根文件系统下创建目录/www,该目录为默认的嵌入式平台web服务器文件所在目录,在/www中放置一个index.html文件。
5、运行boa:
#/bin/boa
6、访问web服务器。http://192.168.1.3,在/var/log/boa/error_log文件中出现如下错误:
boa.c:226- icky Linux kernel bug!: No such file or directory
解决方法:
打开BOA源码下的/src/boa.c文件,将该文件的第226行代码注释掉,如下:
if (setuid(0) != -1) {
//DIE("icky Linux kernelbug!");
}
重新生成boa可执行文件,并将该文件重新拷贝到根文件系统的/bin目录下。在通过PC机的IE访问boaweb服务器:
http://192.168.1.3
7、开机自动运行BOA服务器
在根文件系统的/etc/init.d/rcS文件中增加/bin/boa &,系统启动后,会自动运行BOA Wed服务器。
4、CGI移植
1、从CGIC的主站点http://www.boutell.com/cgic/下载源码,将其解压并进入源码目录
#tar -zxvf cgic205.tar.gz
#cd cgic205
2、修改Makefile文件
1)将CC=gcc,改为CC=arm-linux-gcc
2)将AR=ar,改为AR=arm-linux-ar
3)将RANLIB=ranlib,改为RANLIB=arm-none-linux-gnueabi-ranlib
4)将gcc cgictest.o -ocgictest.cgi ${LIBS},改为$(CC)$(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}
5)将gcc capture.o -o capture${LIBS},改为$(CC) $(CFLAGS) capture.o -ocapture ${LIBS},
3、运行make进行编译
得到CGIC库libcgic.a、调试辅助程序capture和测试程序cgictest.cgi。
4、将libcgic.a拷贝到/usr/local/lib目录下;将cgic.h拷贝到/usr/local/include路径下。
5、将capture和cgictest.cgi拷贝到嵌入式平台的www/cgi-bin目录下。
在宿主机的浏览器地址栏输入http://192.168.1.3/cgi-bin/cgictest.cgi,可以看到页面,CGIC库和测试脚本都移植成功。
四、移植视频流媒体服务器---> mjpeg-streamer
步骤:
mjpg-stream源码包通过下面这个网址下载
http://sourceforge.net/projects/mjpg-streamer/
压源码
tar xvf mjpg-streamer-r63.tar.gz
源码
cd mjpg-streamer-r63
修改顶层makefile及plugins目录中的各级makefile将所有(注意这里需要修改的内容)
CC=gcc
修改为CC=arm--linux--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/chile/jpeg/include
修改
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
为
$(CC) $(CFLAGS) -ljpeg -L/home/chile/jpeg/lib -o $@ input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
编译
make
拷贝PC虚拟机中的 /mjpep-streamer/mjpg-streamer-r63的所有*.so动态库文件拷贝到开发板 /lib/目录下
拷贝执行文件mjpg_streamer到开发板的bin下并改变权限
测试运行
【我的板子chile】:(注意输入有误)
mjpg_streamer -i "/lib/input_uvc.so -d /dev/video3" -o "/lib/output_http.so -w 192.168.1.111:8080"
用火狐浏览器打开一个网页输入下面地址就能够看到一个视频(开发板的IP为192.168.0.88):
http://192.168.1.111:8080/?action=stream
打开一个网页输入下面地址就能够看到一个静态图片:
http://192.168.1.111:8080/?action=snapshot