用树莓派做 RTMP 流直播服务器,可推送至斗鱼直播

在《用树莓派DIY共享鱼缸,支持微信远程喂鱼》一文中,使用了树莓派来做直播服务器。通过安装在树莓派上的摄像头采集实时视频数据流,推送至 RTMP 监听服务器。同时,其他的客户端访问这个 RTMP 服务器就可以观看视频了。下面我们来详细介绍这个模块如何搭建,文末还将给出将直播视频推送至斗鱼直播平台的方法。

需要用的东西和软件说明:

树莓派主板(本文使用树莓派 Zero W 套件,该套件附带一款完美安装摄像头的外壳)
兼容摄像头(本文使用官方摄像头模块,其他 USB 兼容摄像头亦可)
软件方面:
avconv 和 GStreamer 用于采集摄像头捕获的视频流并推送到 RTMP 服务
NGINX 和 RTMP 模块,用于接收视频流,同时提供视频发布功能
Strobe Media Playback,一款基于 Flash 的网页视频播放器

一、配置摄像头

无论是树莓派官方摄像头模块还是其他兼容的USB摄像头,连接好摄像头之后,运行命令去启用摄像头:

sudo raspi-config

编辑系统模块文件。

sudo nano/etc/modules

在这个文件的最后添加一行

bcm2835-v4l2

保存。建议配置好之后重启一下树莓派。然后测试摄像头是否正常工作。

vcgencmd get_camera

输出如图所示表示被识别到。进一步测试拍照。

raspistill -t 2000 -o 1.jpg

执行上面的指令之后,会你用摄像头拍照,并将照片保存在当前目录下,名为 1.jpg。

如果一切正常,恭喜!可以开始下面的步骤了!

二、网络配置

如果你的树莓派使用有线网络的话可以忽略这一步。笔者用的树莓派是 Zero W 版本,没有有线网口,所以必须手动配置无线网络。

sudo nano/etc/network/interfaces

将配置修改为:

auto lo

iface lo inet loopback

allow-hotplug wlan0

auto wlan0

iface wlan0 inet dhcp

        wpa-ssid "WIFISSID"

        wpa-psk "WIFIPASSWORD"

WIFISSID 和 WIFIPASSWORD 分别替换为你的 WIFI 的 SSID 和密码。

网络配置方法可以参考树莓派实验室的其他文章,例如这篇《树莓派 Raspberry Pi 设置无线上网》。

三、安装 NGINX 和 RTMP

我们用 nginx 加上 nginx-rtmp-module 模块作为 RTMP 服务端。这里先安装 nginx 然后再移除它,目的是利用这个过程吧 nginx 相关的依赖安装好并设定好系统环境。这个通过 apt 安装的 nginx 并不能直接使用,因为他并不包含我们需要的 RTMP 模块,所以将它移除。而后我们手工下载 nginx 和 nginx-rtmp-module 模块源码来手工编译安装,以获得我们最终需要的服务端。

sudo apt-get update

#安装 nginx

sudo apt-get -y<span> </span>install nginx

#移除 nginx

sudo apt-get -y remove nginx

sudo apt-get clean

#清空 nginx 的配置文件

sudo rm -rf<span> </span>/etc/nginx/*

#安装编译用的模块

sudo apt-get<span> </span>install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev

#创建存放网页的目录给 nginx 使用

sudo mkdir -p<span> </span>/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 是否安装好。

nginx -v

正常的話,會顯示 nginx 的版本。

配置 nginx。

/etc/nginx/nginx.conf

在末尾添加如下配置:

rtmp {

    server {
        listen 1935;
        chunk_size 4096;
        application live {
            live on;
            record off;
        }<br>}

重启 nginx 服务。

sudo service nginx start

没有错误提示就表示成功了。
到这里 nginx 和 RTMP 模块都准备好了。

四、安装 avconv 和 GStreamer

安装的组件比较多,如果操作的时候因为软件源的问题总是出现错误难以完成,建议更换软件源试试。笔者用的是清华大学软件源安装的。

sudo nano/etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi

开始安装

sudo apt-get update

sudo apt-get<span> </span>install libav-tools

#安装 GStreamer

sudo apt-get<span> </span>install gstreamer1.0-tools

#安装 GStreamer 扩展组件

sudo apt-get <span> </span>install libgstreamer1.0-0 libgstreamer1.0-0-dbg libgstreamer1.0-dev liborc-0.4-0 liborc-0.4-0-dbg liborc-0.4-dev liborc-0.4-doc gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gstreamer1.0-alsa gstreamer1.0-doc gstreamer1.0-omx gstreamer1.0-plugins-bad gstreamer1.0-plugins-bad-dbg gstreamer1.0-plugins-bad-doc gstreamer1.0-plugins-base gstreamer1.0-plugins-base-apps gstreamer1.0-plugins-base-dbg gstreamer1.0-plugins-base-doc gstreamer1.0-plugins-good gstreamer1.0-plugins-good-dbg gstreamer1.0-plugins-good-doc gstreamer1.0-plugins-ugly gstreamer1.0-plugins-ugly-dbg gstreamer1.0-plugins-ugly-doc gstreamer1.0-pulseaudio gstreamer1.0-tools gstreamer1.0-x libgstreamer-plugins-bad1.0-0 libgstreamer-plugins-bad1.0-dev libgstreamer-plugins-base1.0-0 libgstreamer-plugins-base1.0-dev

这里安装了 avconv 和 GStreamer 两套视频采集组件。 avconv 的使用方式是:

avconv -f video4linux2 -r 24 -i<span> </span>/dev/video0 -f flv rtmp://localhost:1935/live

avconv 采用软编码实现,因此 CPU 消耗比较高,推荐用 GStreamer,GStreamer 的采集使用如下命令:

gst-launch-1.0 -v v4l2src device=/dev/video0 !<span> </span>'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1'

如果希望在后台运行这两个命令可以在命令后面添加&,例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 !<span> </span>'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1' &

device=/dev/video0 这个参数可以省去,除非在有多个摄像头的时候,希望指定视频采集自某个指定的摄像头才需要这个参数。
采集的视频怎么播放呢?请看下面介绍。

五、实时视频的呈现

有多种方式呈现直播视频画面:
1、使用 RTMP 播放器播放视频流
例如 VLC 等播放器(桌面版和手机版均有)支持 RTMP 视频流播放,填入 rtmp://树莓派的IP地址/live即可播放。不过这个软件有数十秒的缓冲延迟,需要设定缓冲时间来缩短延迟。

2、使用 Strobe Media Playback 创建播放页面,通过网页播放视频流
这个是在树莓派上创建一个带有播放功能的网页,播放器选用 Strobe Media Playback,当然你也可以选择其他支持 RTMP 的播放器控件。播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。下面介绍这个播放页面的创建方法。

mkdir -p ~/strobe_src
cd ~/strobe_src
wget http://downloads.sourceforge.net/project/smp.adobe/Strobe%20Media%20Playback%201.6%20Release%20%28source%20and%20binaries%29/StrobeMediaPlayback_1.6.328-full.zip
unzip StrobeMediaPlayback_1.6.328-full.zip
sudo cp -rfor\ Flash\ Player\ 10.1/var/www/html/strobe
sudo nano/var/www/html/index.html

填入如下内容,记得把下面的“树莓派的IP地址”替换成你的树莓派实际的IP地址。IP地址可以通过 ifconfig 命令查看。

<!DOCTYPE html><br><br><html><br><br><head><br><br><title>Live Streaming</title><br><br><!-- strobe --><br><br><script type="text/javascript" src="strobe/lib/swfobject.js"></script><br><br><script type="text/javascript"><br><br>  var parameters = { <br><br>     src: "rtmp://{pi_address}/rtmp/live"<span class="s1">,</span> <br><br>     autoPlay: false<span class="s1">,</span> <br><br>     controlBarAutoHide: false<span class="s1">,</span> <br><br>     playButtonOverlay: true<span class="s1">,</span> <br><br>     showVideoInfoOverlayOnStartUp: true<span class="s1">,</span> <br><br>     optimizeBuffering : false<span class="s1">,</span> <br><br>     initialBufferTime : 0.1<span class="s1">,</span> <br><br>     expandedBufferTime : 0.1<span class="s1">,</span> <br><br>     minContinuousPlayback : 0.1<span class="s1">,</span> <br><br>     poster: "images/poster.png" <br><br>  }<span class="s1">;</span> <br><br>  swfobject.embedSWF<span class="s1">(</span><br><br>    "strobe/StrobeMediaPlayback.swf"<br><br>    <span class="s1">,</span> "StrobeMediaPlayback"<br><br>    <span class="s1">,</span> 1024<br><br>    <span class="s1">,</span> 768<br><br>    <span class="s1">,</span> "10.1.0"<br><br>    <span class="s1">,</span> "strobe/expressInstall.swf"<br><br>    <span class="s1">,</span> parameters<br><br>    <span class="s1">,</span> {<br><br>      allowFullScreen: "true"<br><br>    }<br><br>    <span class="s1">,</span> {<br><br>      name: "StrobeMediaPlayback"<br><br>    }<br><br>  <span class="s1">);</span><br><br></script><br><br></head><br><br><body><br><br><div id="StrobeMediaPlayback"></div><br><br></body><br><br></html>

播放的时候用浏览器打开 http://树莓派的IP地址/index.html 进入播放界面。

3、推送至斗鱼直播平台观看
你可能注意到了 GStreamer 这个命令中有 location 这个参数。这个参数是设定采集到的视频流推向哪里,通过设定这个参数可以将视频流推向任何支持 RTMP 协议的服务器。

gst-launch-1.0 -v v4l2src device=/dev/video0 !'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://树莓派的IP地址/live live=1'

斗鱼平台同样采用了 RTMP 协议传输直播视频,以斗鱼平台为例来说明一下推流到斗鱼的方法。

首先获取斗鱼的 RTMP 推流地址。开启了直播室之后可以获得推流码。注意,斗鱼的推流码是有时限的,取到推流码需要尽快使用以免过期。

把这两个参数组合起来(中间加上/)。修改之后的命令例如:

gst-launch-1.0 -v v4l2src device=/dev/video0 !'video/x-raw, width=1024, height=768, framerate=30/1' ! queue ! videoconvert ! omxh264enc ! h264parse ! flvmux ! rtmpsink location='rtmp://send1.douyu.com/live/1372rSOMdcBJ8UHD?wsSecret=96d2k4ecdf267d17b8e8c38b6a4a6efd&wsTime=59f92e2e&wsSeek=off live=1'

然后就可以开播了。

打个小广告,欢迎大家关注我的斗鱼直播间~
https://www.douyu.com/1372
这里不定期直播宠物鱼。
应用以上技术实现的远程喂鱼项目:
http://maker.quwj.com/program/nature-aquarium

总体上三种播放方式都有一定延迟,其中网页 Strobe Media Playback 播放延迟最小,大概在1秒左右。VLC 延迟比较固定默认约20秒,个别平台的版本是可以设置延迟数值的笔者没有亲力尝试。然后是斗鱼平台,斗鱼随着播放时间变长延迟也越来越长,需要刷新直播间页面才会同步。

搭建过程有问题请在树莓派实验室原文下面留言,转载请保证文章内容完整、注明出处并附带原文链接~

本文来自:http://shumeipai.nxez.com/2017/11/01/build-rtmp-stream-live-server-with-raspberry-pi.html

用树莓派DIY共享鱼缸,支持微信远程喂鱼

近期把精心打理数年的水族缸给“开源共享了”,实现了远程观赏和喂鱼互动的功能,先看效果吧。
直播页面:http://maker.quwj.com/program/nature-aquarium
远程喂鱼没有自己设计操作界面,而是接入了微信公众平台,通过微信发送指令实现投食。看这段现场演示视频:https://v.qq.com/x/page/f0554ga4h2k.html

投食说明在直播页面和项目主页都有详细介绍。这个项目的意义还在于你可以把自家的屏幕变成虚拟水族馆,没事看看鱼,和鱼互动一下,等同于养了一缸鱼。更让人激动的是,你根本只管投食只管享用悠然自得,维护鱼缸等琐碎繁杂的问题全都不用管,是不是便宜占尽了呢?

 

下面分享一下搭建这套共享水族馆的 Make 过程,其中有关于树莓派上实现视频直播的几种方案近期会在树莓派实验室进行介绍,有兴趣的朋友可以参考把自家的宠物也共享出来(需要支持可以联系本项目作者)。

组件清单

普通生态鱼缸 × 1
树莓派主板 × 1
罗技 C270 摄像头 × 1
自动投食器 × 1
LED 鱼缸灯 × 1
继电器 × 2
路由器 × 1
公网IP地址 × 1
微信公众账号 × 1

系统架构

这里介绍下最关键的投食流程。用户通过微信给趣无尽微信公号发送投食指令,微信公众平台调用之前设定好的后台服务,将指令保存在控制服务器上。然后由树莓派去从控制服务器上取这个指令并执行。
这么设计主要是考虑到实际环境下的稳定性,当然最简单的方式是把树莓派直接暴露在外网,用户直接连上树莓派进行操作也完全可行。
树莓派拿到投食的指令之后,控制投食机完成投食。
没错,这个投食机怎么方便实现是小问题。我直接买了一个现成的投食机,Hack 一下开关部件,加一个继电器接入树莓派就搞定了。

Hack 投食机

Hack 前的投食机如图所示。

拆开后发现结构简单,测试了一下,最上面的开关位置短接即可启动投食机。

所以就把开关接出来,用继电器控制吧。用烙铁在旁边捅了个洞,以便把线引出来。

 

接好继电器。

整个树莓派控制设备如下。

投食机装到鱼缸上,大功告成。

至于直播,采用 motion、simple rtmp plublish 或 gstreamer 方案。几种方案近期会在树莓派实验室进行介绍。

其中最关键的非技术性因素是,你的 ISP 需要给你分配了公网 IP 地址,这样你才可以将树莓派的某个服务(比如视频采集)通过路由器的端口映射暴露在外网。

项目主页:http://maker.quwj.com/project/4

项目补充说明:
1.视频实时采集自一台树莓派3B,由于树莓派性能、稳定性、家庭带宽等多重因素限制,在线人数较多时直播服务可能会出现卡顿或不可用。
2.请使用安装了 Flash 插件的浏览器打开,目前暂不支持 iPhone、iPad 浏览器观看,推荐使用 Chrome。
3.一般情况下,10~22点之外的时间段水族馆灭灯,这时基本上神马都看不到属于正常状况。
4.项目当前处于测试中,对性能优化尚在探索中,画质没有开到最佳。
5.项目随时会因设备维护而临时中断直播、关闭投食,属于正常状况。维护结束后会重新开放。
6.如发现水族馆存在异常状况,请联系作者处理,微信 spoony002。
7.作者组建了一个微信群,欢迎对热带鱼、草缸等有兴趣的朋友加入交流养鱼的经验和乐趣。添加作者微信号 spoony002 说明入群。

本文来自

用树莓派DIY共享鱼缸,支持微信远程喂鱼