(1) 能不能用树莓派同时控制多个摄像头进行拍照

1. 方法(一)

树莓派是一种卡片计算机,拥有很高的运算能力,我们项目做动物监测系统,要求能够传输视频数据,并将视频上传至服务器,当初我的想法是采用推流,将摄像头数据推流至服务器,然后使用电脑进行拉流并存至本地,

Android多摄像头 物理摄像头_服务器

  1. 在树莓派上编译ffmpeg源码,源码从http://ffmpeg.org/download.html下载,这个软件是开源的,任何人都可以免费下载,并修改,将源码下载下来并解压,在安装前要对它进行简单的配置并且需要下载依赖库
1.  sudo apt-get install aptitude
 sudo aptitude install libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libxext-dev libxfixes-dev

依次执行上面的命令,但是我在安装过程中会出现 安装不了 libfaac 这个库,但是这个库的作用我搜了搜,是编码声音用的,我只是采集视频图像,并不需要这个库
所以我在编译源码时并没有添加这个选项,直接将它禁用了,输入下面命令
Configure./-enable-nonfree --disenable-libfaac --enable-gpl --enable-libx264 --disable-asm
之后完成配置,然后输入 make 命令 进行编译, 之后在输入sudo make install 进行安装, libx264 这个库很重要,时进行视频编码用的,一定要将它编译进去,

  1. 要配置服务器端了,我是在本地使用虚拟机进行服务器搭建的,我用的是ubuntu 服务器版本,首先安装nginx 服务器, 输入
2.  sudo apt-get update
 #软件更新
 sudo apt-get -y install nginx
 #安装 nginx
 sudo apt-get -y remove nginx
 sudo apt-get clean
 #清空 nginx 的配置文件
 sudo rm -rf /etc/nginx/*
 #安装编译用的模块
 sudo apt-get install -y curl build-essential libpcre3 libpcre3-dev libpcre+±dev zlib1g-dev libcurl4-openssl-dev libssl-dev
 #创建存放网页的目录给 nginx 使用
 sudo mkdir -p /var/www
 #创建编译用的目录
 mkdir -p ~/nginx_src
 cd ~/nginx_src
 #下载 nginx 源码包
 wget http://nginx.org/download/nginx-1.11.8.tar.gz
 #下载 nginx-rtmp-module 源码包
 wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
 tar -zxvf nginx-1.11.8.tar.gz
 unzip master.zip
 cd nginx-1.11.8
 #设定编译参数
 ./configure --prefix=/var/www --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --without-http_proxy_module --add-module=/home/pi/nginx_src/nginx-rtmp-module-master
 #开始编译安装
 make
 sudo make install

我按照上面步骤安装很顺利,并没有遇到各种各样的报错,接下里就是配置nginx服务器了,服务器配置文件在下面的路径/etc/nginx/,直接输入 vim /etc/nginx/nginx.conf
进行编辑,然后在文件末尾 添加如下模块

rtmp {
 server {
 listen 1900;
 chunk_size 4096;
 application live {
 live on;
 record off;
 }
 }
 }
 重启 nginx 服务。
 sudo service nginx start

这些步骤都没有出现问题,按照流程安装就可以了,
之后就开始进行推流将视频数据推流至服务器
ffmpeg -ss 0 -t 10 -i /dev/video0 -f flv rtmp://rtmp server address:server port/project name/stream name
rtmp server address 这个为服务器的ip地址,可以使用ifconfig 进行查看,
port 端口,就是刚才服务器配置文件中的服务器端口 1935
stream name 这个名称 是取名为 live
之后就可以进行推流了,但是在推流过程中我遇到一个问题,就是当我使用电脑监控
树莓派CPU时,竟然占用90%多,而且拉流过程中,视频严重卡顿,延迟率非常高
我猜是树莓派进行视频编码占用非常高的CPU资源,所以视频很卡顿,根本没有使用价值,所以我放弃了这个方案,采用了第二种方案。

第二种方案,我使用 MJPG-Streamer 进行推流,这个方案我也是参考其他资料的,
偶然发现这个软件扩展性非常强,可以通过修改源码来实现想要的功能,其实它也是流转发的软件,但是这里的流其是是图片。

进入树莓派终端安装依赖库

sudo apt-get install subversion
 sudo apt-get install libjpeg8-dev
 sudo apt-get install imagemagick
 sudo apt-get install libv4l-dev
 sudo apt-get install cmake
 进行软件源码编译安装
 sudo git clone https://github.com/jacksonliam/mjpg-streamer.git
 cd mjpg-streamer/mjpg-streamer-experimental
 make all
 sudo make install

这个软件安装过程相比ffmpeg 就简单多了,
输入 ./mjpg_streamer -i “./input_uvc.so” -o “./output_http.so -w ./www”
然后直接在服务器端打开,我发现传输的视频相比ffmpeg 非常流畅,延时200毫秒
左右,而且这个软件的源码结构也很清晰,他给用户很大的修改空间,其中 input_file, input_uvc, input_http, input_opencv, input_raspicam, input_ptp2 这几个源文件为输入程序,就是这几个文件获取摄像头数据的,output_http, output_file, output_udp,output_rtsp, 这几个为输出文件,是不是可以将opencv 用来处理摄像头采集的图像数据,并将其推流,这是我的设想,大概就是这个软件有好多插件,配合树莓派的话,应该该可以做硬件控制,在MJPG-streamer.h 文件有
#include “plugins/input.h”
#include “plugins/output.h”

而其中的 input.h 就是输入 ,output.h 就是输出,于是我又打开了这个目录的头文件,哈哈,果然是这两个头文件负责管理输入插件,目录如下

Android多摄像头 物理摄像头_nginx_02

进一步打开input.h,其实它里面就是 linux 下的 v4l2 编程,就是调用了linux 内核提供的摄像头接口,然后从摄像头获取采集数据,

Android多摄像头 物理摄像头_nginx_03

这是使用免驱动摄像头就是USB摄像头 作为输入时的源码目录, usb摄像头

采集的数据为yuyv格式,jpeg_utils.c中的一个函数之间大概就是将摄像头采集的yuyv格式转化为JPEG格式,如下图对函数作用的描述。

Android多摄像头 物理摄像头_摄像头_04


也就是说使用Opencv将转化好的JPEG格式图片进行处理,就成为很大的可能。