背景
树莓派小巧的身材、高扩展性的接口适合做一下非常geek的事情,很多人在买到树莓派后很可能也会和官方摄像头一并购买,但是摄像头的用处也往往被局限在了内网,显得很鸡肋。因此笔者就想办法让树莓派的成像在公网被访问的到,满足了很多人做监控(智能家居)的需求。
材料清单:
- 树莓派
- 树莓官方摄像头(USB的也可以)
- 一台云服务器(阿里云、腾讯云等各种云均可)
思路
笔者尝试了motion、mjpg-streamer等,都不太理想,原因是这些局限在能访问到树莓派网络地址的网络中,也就是说如果你的树莓派没有被映射到公网中就不能从公网访问了,这是显而易见的。而用花生壳之类的公网映射服务的话,速度也不一定能得到保证,所以这些方法都被笔者否决了。
因此笔者想了另一个方法,既然视频流没有办法从公网外部直接访问,那么可以将视频流主动推送到一个大家都能访问得到的地方就行了。
所以笔者就想到了rtmp协议,rtmp协议是直播常用的流媒体传输协议,可以用其发送h264的flv流。 而树莓派可以使用ffmpeg将视频推值rtmp服务器。很简单的一个原理。
概括来说就是:
树莓派摄像头 -> ffmpeg -> rtmp -> nginx -> VLC media player
目录
1. 树莓派部分
1. 摄像头安装
2. ffmpeg安装
2. 服务器部分
1. 编译Nginx
2. 配置
3. 推流
3. 更多的玩法 (如果没有独立的服务器,但会科学上网的话看这里)
步骤
一、树莓派部分
1. 摄像头安装
如图,将可活动的固定片轻轻抽起,插入摄像头数据线,注意摄像头金属片应该朝不可活动的一端,再将活动片按下即可。
启动树莓派,在命令行中输入
$ sudo raspi-config
启动树莓派配置页面
选择“Interfacing Options” -> “camera” 打开即可。
完成之后可以使用命令
$ raspistill -o hello.jpg
如果当前目录下出来了叫hello.jpg的照片的话,说明摄像头安装得当了。
2. ffmpeg安装
方法一: 命令行安装 (推荐)
ffmpeg没有在树莓派的源中,因此需要手动添加
$ sudo vim /etc/apt/sources.list
加入一行
deb http://www.deb-multimedia.org jessie main non-free
执行
$ sudo apt-get update
$ sudo apt-get install ffmpeg
就安装成功了
方法二: 源码安装
下载源码
$ git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg
配置并编译安装
$ cd ffmpeg
$ sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
$ make
$ sudo make install
其中make的时候一定要有耐心,我保守估计编译了两个小时。如果不能保证电脑常开的话,强烈推荐用screen命令在新窗口中运行,以防连接断开造成的损坏。
服务器部分
笔者的服务器是腾讯云Ubuntu 16.04版本,该方法应该能在现有服务器上跑起来。
1.编译Nginx
先把nginx和nginx-rtmp-module源码下载下来
$ wget https://nginx.org/download/nginx-1.13.4.tar.gz # 请在nginx官网上找最新版本
$ git clone https://github.com/arut/nginx-rtmp-module.git # 两者最好放在同一目录,方便路径书写
安装编译依赖
$ sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
解压nginx压缩包
$ tar -zxvf nginx-1.13.4.tar.gz
$ cd nginx-1.13.4
编译nginx
$ ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module # 里面nginx-rtmp-module的目录可以根据你下载的目录更换
$ make
$ sudo make install
安装nginx启动脚本
$ sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo update-rc.d nginx defaults
启停一次nginx,生成配置文件
$ sudo service nginx start
$ sudo service nginx stop
安装ffmpeg
$ sudo apt-add-repository ppa:jon-severinsson/ffmpeg
$ sudo apt-get update
$ sudo apt-get install ffmpeg
服务器配置
使用vim编辑配置文件
$ sudo vim /usr/local/nginx/conf/nginx.conf
在末尾添加
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
exec ffmpeg -i rtmp://localhost/live/$name -threads 1 -c:v libx264 -profile:v baseline -b:v 350K -s 640x360 -f flv -c:a aac -ac 1 -strict -2 -b:a 56k rtmp://localhost/living/$name;
}
application liveing {
live on;
record off;
}
}
}
按esc,输入冒号后输入wq,回车关闭保存配置文件。
重启nginx
$ sudo service nginx restart
推流
在树莓派上打开一个screen,输入
raspivid -o - -t 0 -vf -hf -fps 10 -b 500000 | ffmpeg -re -ar 44100 -ac 2 -acodec pcm_s16le -f s16le -ac 2 -i /dev/zero -f h264 -i - -vcodec copy -acodec aac -ab 128k -g 50 -strict experimental -f flv rtmp://你的服务器IP/live/任意名称
看到这些输出就说明成功了
可以下载一个VLC播放器
在open media里面选择network,url中填写你刚才输入的rtmp链接,点击open就可以看到你的画面啦。
更多的玩法
提示一下,在youtube里面的“上传”旁边,有一个“直播”
进入后,在下面你可以看到这个编码器设置
你可以构造一个rtmp地址:
rtmp://a.rtmp.youtube.com/live2/你的密钥
将上面在树莓派中执行的那段代码的rtmp地址替换为这个就可以在youtube上看你的直播了哦,这个是不需要额外的服务器的,而且更稳定。不过你得先学会科学上网。
powered by moha.vip