请选择 进入手机版 | 继续访问电脑版
查看: 666|回复: 0

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

[复制链接]

主题

帖子

0

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
0
发表于 2019-6-24 17:01:04 | 显示全部楼层 |阅读模式
转自:树莓派中文站 knowncold

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




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




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

  1. <font size="3" face="微软雅黑">sudo raspi-config</font>
复制代码



编辑系统模块文件。
  1. <font size="3" face="微软雅黑">sudo nano/etc/modules</font>
复制代码

在这个文件的最后添加一行
  1. <font size="3" face="微软雅黑">bcm2835-v4l2</font>
复制代码

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



输出如图所示表示被识别到。进一步测试拍照。
raspistill -t 2000 -o 1.jpg执行上面的指令之后,会你用摄像头拍照,并将照片保存在当前目录下,名为 1.jpg。


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

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

  1. <font size="3" face="微软雅黑">sudo nano/etc/network/interfaces</font>
复制代码

将配置修改为:
  1. <font size="3" face="微软雅黑">auto lo
  2. iface lo inet loopback

  3. allow-hotplug wlan0
  4. auto wlan0
  5. iface wlan0 inet dhcp

  6. wpa-ssid "WIFISSID"
  7. wpa-psk "WIFIPASSWORD"</font>
复制代码
分别替换为你的 WIFI 的 SSID 和密码。
网络配置方法可以参考树莓派实验室的其他文章,例如这篇《树莓派 Raspberry Pi 设置无线上网》。


三、安装 NGINX 和 RTMP

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

  1. <font size="3" face="微软雅黑">sudo apt-get update

  2. # 安装 nginx
  3. sudo apt-get -y install nginx

  4. #移除 nginx>
  5. sudo apt-get -y remove nginx
  6. sudo apt-get clean

  7. # 清空 nginx 的配置文件
  8. sudo rm -rf /etc/nginx/ * </font>

  9. # 安装编译用的模块
  10. sudo apt-ge install -y curl build-essential libpcre3 libpcre3-dev libpcre++-dev zlib1g-dev libcurl4-openssl-dev libssl-dev

  11. # 创建存放网页的目录给 nginx 使用
  12. sudo mkdir -p /var/www

  13. # 创建编译用的目录
  14. mkdir -p ~/nginx_src
  15. cd ~/nginx_src

  16. # 下载 nginx 源码包
  17. wget http://nginx.org/download/nginx-1.11.8.tar.gz

  18. # 下载 nginx-rtmp-module 源码包
  19. wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
  20. tar -zxvf nginx-1.11.8.tar.gz
  21. unzip master.zip
  22. cd nginx-1.11.8

  23. # 设定编译参数
  24. ./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

  25. # 开始编译安装
  26. make
  27. sudo make install</font>
复制代码
l

比较漫长的等待之后,编译安装结束。这时可以测试 nginx 是否安装好。
nginx -v正常的話,會顯示 nginx 的版本。


配置 nginx
/etc/nginx/nginx.conf在末尾添加如下配置:
  1. <font face="微软雅黑">rtmp {
  2.     server {
  3.         listen 1935;
  4.         chunk_size 4096;
  5.         application live {
  6.             live on;
  7.             record off;
  8.         }
  9.     }
  10. }</font>
复制代码

重启 nginx 服务。
  1. <font size="3" face="微软雅黑">sudo service nginx start</font>
复制代码

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

四、安装 avconv 和 GStreamer

安装的组件比较多,如果操作的时候因为软件源的问题总是出现错误难以完成,建议更换软件源试试。笔者用的是清华大学软件源安装的。
  1. <font size="3" face="微软雅黑">sudo nano/etc/apt/sources.list </font>
复制代码
  1. <font size="3" face="黑体">deb https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
  2. deb-src https://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi</font>
复制代码

开始安装
这里安装了 avconv 和 GStreamer 两套视频采集组件。 avconv 的使用方式是:
  1. <font size="3" face="微软雅黑">avconv -f video4linux2 -r 24 -i<span> </span>/dev/video0 -f flv rtmp://localhost:1935/live</font>
复制代码

采用软编码实现,因此 CPU 消耗比较高,推荐用 GStreamer,GStreamer 的采集使用如下命令:
  1. <font size="3" face="微软雅黑">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'</font>
复制代码

如果希望在后台运行这两个命令可以在命令后面添加&,例如:
  1. <font size="3" face="微软雅黑">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</font>
复制代码

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



五、实时视频的呈现有多种方式呈现直播视频画面:
1、使用 RTMP 播放器播放视频流
例如 VLC 等播放器(桌面版和手机版均有)支持 RTMP 视频流播放,填入
  1. <font size="3" face="微软雅黑">rtmp://树莓派的IP地址/live</font>
复制代码

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

  1. <font size="3" face="微软雅黑">mkdir -p ~/strobe_src
  2. cd ~/strobe_src
  3. 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
  4. unzip StrobeMediaPlayback_1.6.328-full.zip
  5. sudo cp -rfor\ Flash\ Player\ 10.1/var/www/html/strobe
  6. sudo nano/var/www/html/index.html</font>
复制代码

填入如下内容,记得把下面的“树莓派的IP地址”替换成你的树莓派实际的IP地址。IP地址可以通过 ifconfig 命令查看。
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Live Streaming</title>

  5. <!-- strobe -->
  6. <script type="text/javascript" src="strobe/lib/swfobject.js"></script>
  7. <script type="text/javascript">
  8.   var parameters = {  
  9.      src: "rtmp://{pi_address}/rtmp/live",  
  10.      autoPlay: false,  
  11.      controlBarAutoHide: false,  
  12.      playButtonOverlay: true,  
  13.      showVideoInfoOverlayOnStartUp: true,  
  14.      optimizeBuffering : false,  
  15.      initialBufferTime : 0.1,  
  16.      expandedBufferTime : 0.1,  
  17.      minContinuousPlayback : 0.1,  
  18.      poster: "images/poster.png"  
  19.   };  
  20.   swfobject.embedSWF(
  21.     "strobe/StrobeMediaPlayback.swf"
  22.     , "StrobeMediaPlayback"
  23.     , 1024
  24.     , 768
  25.     , "10.1.0"
  26.     , "strobe/expressInstall.swf"
  27.     , parameters
  28.     , {
  29.       allowFullScreen: "true"
  30.     }
  31.     , {
  32.       name: "StrobeMediaPlayback"
  33.     }
  34.   );
  35. </script>

  36. </head>
  37. <body>
  38. <div id="StrobeMediaPlayback"></div>
  39. </body>
  40. </html>
复制代码

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


3、推送至斗鱼直播平台观看
你可能注意到了 GStreamer 这个命令中有 location 这个参数。这个参数是设定采集到的视频流推向哪里,通过设定这个参数可以将视频流推向任何支持 RTMP 协议的服务器。
  1. <font size="3" face="微软雅黑">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'</font>
复制代码

斗鱼平台同样采用了 RTMP 协议传输直播视频,以斗鱼平台为例来说明一下推流到斗鱼的方法。
首先获取斗鱼的 RTMP 推流地址。开启了直播室之后可以获得推流码。注意,斗鱼的推流码是有时限的,取到推流码需要尽快使用以免过期。



把这两个参数组合起来(中间加上/)。修改之后的命令例如:
  1. <font size="3" face="微软雅黑">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'</font>
复制代码

然后就可以开播了。


打个小广告,欢迎大家关注我的斗鱼直播间~
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




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|iceasy com ( 粤ICP备19072333号-1 )

GMT+8, 2020-6-6 08:38 , Processed in 0.131731 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表