1、什么是mjpg-streamer
MJPG-streamer是一款免费基于IP地址的视频流服务器,它的输入插件从摄像头读取视频数据,这个输入插件产生视频数据并将视频数据复制到内存中,它有多个输出插件将这些视频数据经过处理,其中最重要的输出插件是网站服务器插件,它将视频数据传送到用户浏览器中,MJPG-streamer的工作就是将其中的一个输入插件和多个输出插件绑定在一起,所有的工作都是通过它的各个插件完成的。
各个文件如下:
(1)input_testpicture.so。这是一个图像测试插件,它将预设好的图像编译成一个头文件,可以在没有摄像头的情况下传输图像,从而方便调试程序。
(2)input_uvc.so。此文件调用USB摄像头驱动程序V4L2,从摄像头读取视频数据。
(3)input_control.so。这个文件实现对摄像头转动的控制接口。
(4)output_http.so。这是一个功能齐全的网站服务器,它不仅可以从单一文件夹中处理文件,还可以执行一定的命令,它可以从输入插件中处理一幅图像,也可以将输入插件的视频文件根据现有M-JPEG标准以HTTP视频数据服务流形式输出。
(5)output_file.so。这个插件的功能是将输入插件的JPEG图像存储到特定的文件夹下,它可以用来抓取图像。
2、如何将mjpg-streamer移植到开发板上
(1) libjpeg 的移植(因为MJPG-streamer依赖于jpeg库)
解压libjpeg库
tar xzvf libjpeg-turbo-1.2.1.tar.gz
切换到libjpeg库目录下
cd libjpeg-turbo-1.2.1
建目录tmp
mkdir tmp
./configure --host=arm-linux --prefix=$(pwd)/_install的含义
$ ./configure 下面两个都是运行configure时给的参数
--host=arm-linux 运行环境 (交叉编译成arm)
--prefix=$(pwd)/_install 安装目录
pwd是当前用户目录。
进行配置,--prefix=是指定安装目录/work/nfs_root/libpeg-turbo-1.2.1/tmp,--host=arm-linux是指定运行环境是arm
./configure --prefix=/work/nfs_root/libjpeg-turbo-1.2.1/tmp --host=arm-linux编译
make
安装
make install
把/work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/目录下的动态库拷贝到/work/nfs_root/fs_mini_mdev_new/lib/目录下(-d表示原来是链接文件也作为链接文件拷贝过去)
cp /work/nfs_root/libjpeg-turbo-1.2.1/tmp/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib/ -d(2) mjpg-streamer 的移植:
解压
tar xvf mjpg-streamer-r63.tar.gz
切换到mjpg-streamer-r63目录下
cd mjpg-streamer-r63修改所有的Makefile
arm-linux-gcc是交叉编译工具链,用于 编译出能在ARM平台上运行的程序,而gcc编译出来的程序在x86平台上运行
--(2) 修改plugins/input_uvc/Makfile
-O2是优化选项,-DLINUX -D_GNU_SOURCE,-Wall表示打开所有需要注意的警告信息,-shared指定生成动态连接库,-fPIC 表示编译为位置独立的代码,
-I/work/nfs_root/libjpeg-turbo-1.2.1/tmp/include 表示指定所需要的头文件
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC
改为
CFLAGS += -O2 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /work/nfs_root/libjpeg-turbo-1.2.1/tmp/include
注意:
-I /work/jz2440/libjpeg-turbo-1.2.1/tmp/include // 是编译libjpeg 生成的文件
o: 编译的目标文件
a: 静态库,其实就是把若干o文件打了个包
so: 动态链接库(共享库)
lo: 使用libtool编译出的目标文件,其实就是在o文件中添加了一些信息
la: 使用libtool编译出的库文件,其实是个文本文件,记录同名动态库和静态库的相关信息
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称,即libtest.so
b. 将
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -ljpeg -o $@ input_uvc.c v4l2uvc.lo
jpeg_utils.lo dynctrl.lo
改为
input_uvc.so: $(OTHER_HEADERS) input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo
$(CC) $(CFLAGS) -ljpeg -L /work/jz2440/libjpeg-turbo-1.2.1/tmp/lib -o
$@ input_uvc.c v4l2uvc.lo j peg_utils.lo dynctrl.lo
编译
make
把 mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/目录下的动态库文件拷贝到/work/nfs_root/fs_mini_mdev_new/lib/ 目录下
cp mjpg_streamer /work/nfs_root/fs_mini_mdev_new/bin/cp *so* /work/nfs_root/fs_mini_mdev_new/lib/ -d
mjpg_streamer -i "input_uvc.so -f 10 -r 320*240" -o "output_http.so -w www"
3、命令参数
这个是我设置的参数:输入UVC,网页输出,图片输出(更详细的设置,建议去看源码)
mjpg_streamer -i "input_uvc.so -f 10 -r 320*240 -y" -o "output_http.so -c "ruoyun:liufeng" -w www -p 8888" -o "output_file.so -d 1000 -f /mnt "
-i 输入
"input_uvc.so -f 10 -r 320*240 -y"
input_uvc.so:UVC输入组件
-f 10 :表示10帧
-r 320*240 :分辨率
-y :YUV格式输入(有卡顿),不加表示MJPG输入(需要摄像头支持)
-o输出
"output_http.so -c "ruoyun:liufeng" -w www -p 8888"
output_http.so :网页输出组件
-c "ruoyun:liufeng" :用户名:ruoyun 密码:liufeng
-w www : 网页输出
-p 8888 :端口 8888
"output_file.so -d 1000 -f /mnt "
output_file.so :图片输出组件
-d 1000 : 时间1S
-f /mnt :输出图片放在哪,我是开机直接把/mnu挂载到本地文件夹了
4、使用
在firefox浏览器里面输入 http://192.168.1.1:8080/?action=stream ,应该能看到摄像头抓取的视频。
动态视频:192.168.1.1:8080/?action=stream
静态图像:192.168.1.1:8080/?action=snapshot