玩直播,如何构建一套自己的直播平台?

宅时光之 Refresh 新知系列 3

Posted by 薛以致用 on February 22, 2020

申明

本站点所有文章,仅代表个人想法,不代表任何公司立场,所有数据都来自公开资料

转载请注明出处

这是直播平台技术的第二篇,在第一篇《聊直播,这些知识点你必须要懂》我们初步了解了直播的基本架构以及常用术语,有朋友问,我想自己搭建一个直播平台,该怎么玩?

没错,纸上得来终觉浅,出于好奇,我们一起来试试,如何用开源方案+云平台搭建一个直播平台?

准备工作

为了实现如下直播架构,我们需要准备哪些工具?

LiveStreming Demo Preparation?

要搭建这样的一个直播平台,需要准备:

  • 一个云主机:为了托管媒体服务器,本文使用 AWS 宁夏的 C5.xlarge(4 vCPU, 8 GB 内存),操作系统 Ubuntu Server 18.04
  • CDN 和域名:使用 AWS Cloudfront 和以及本站点图床的域名
  • 媒体服务器:准备选择一款开源、且文档比较全的;要支持 RTMP/HTTP-FLV, HLS 和 DASH;
  • 测试用的短片和摄像头,作为直播源
  • 播放器:直接使用了西瓜视频的HTML 5 播放器,该播放器支持 HTTP-FLV/HLS/DASH; 如果需要测试 RTMP 拉流播放,可以使用 VLC 本地播放器;

媒体服务器选型

网上找了不少资料,主要进入视野的有,SRS(Simple RTMP Server)、Nginx RTMP Module、Red5-server以及 商业版的 Wowza Streaming Engine, Red5Pro,Xirsys,BMS(Bravo Media Server)等等。SRS 的 Wiki 有一个简单的对比如下

流媒体服务器-直播流处理能力

功能 SRS NGINX AMS WOWZA
RTMP Stable Stable Stable Stable
HLS Stable Stable Stable Stable
HTTP FLV Stable X X X
HLS(aonly) Stable X Stable Stable
HDS Experiment X Stable Stable
MPEG-DASH Experiment Stable X X
HTTP Server Stable Stable X Stable

看完几个项目描述,我就选定了 Nginx RTMP Module 和 SRS,两个在 Github 的好评度,分别为 9K Star 和 7.4K Star;基于 Nginx 的 RTMP 插件,对客户而言,通常都有 Web 服务器,只要增加一个新的模块和配置就可以支持直播服务,很赞;另外 SRS 是国内技术人员开源和贡献的,支持集群高可用以及容器化部署,完美,而且文档比较完整,一直在更新;组合这两个我就可以同时支撑 RTMP/HTTP-FLV/DASH/HLS 这几个常见的直播协议了。

流媒体服务器安装

启动一个 EC2 大小可以是 C5.large 或 C5.xlarge, 选择官方的 Ubuntu Server 18.04/ami-01d4e30d4d4952d0f 作为操作系统;该机器需要可以访问互联网,所以安全组要设定好,比如本文推荐的设置是:

Type Protocol Port Range Source 备注
All Traffic All All 52.82.128.0/19 放行 Cloudfront 访问
All Traffic All All sg-00c1951909 本安全组到本安全组放行,比如ALB和该机器之间共用同一个安全组
All Traffic All All 101.xx.xx.xx/32 我的 Mac 笔记本工作机的公网地址
SSH TCP 22 101.xx.xx.xx/32 我的 Mac 笔记本工作机的公网地址

安装启动 Nginx 和 SRS 参考我的 Github 脚本

除了流媒体服务器,我们还需要安装 ffmpeg 作为推流工具:

sudo apt-get update
sudo apt install ffmpeg

如何推流?

直播流可以是已经存在的一个视频,这种情况下,利用 ffmpeg 工具可以非常方便的将视频作为源发布到流媒体服务器,利用上面的方法,我们安装好的流媒体服务的推流地址分别为(把相应的 IP 地址替换成上面的流媒体服务器的公网 IPv4 地址):

SRS 服务器,只需要一个地址进行推流:

  • rtmp://[xxx.xxx.xxx.xxx]:1935/live/[stream name]

Nginx 服务器,不同协议需要给不同的地址推流:

  • RTMP 协议:rtmp://[xxx.xxx.xxx.xxx]:19359/live/[stream name]
  • HLS 协议:rtmp://[xxx.xxx.xxx.xxx]:19359/hls/[stream name]
  • DASH 协议:rtmp://[xxx.xxx.xxx.xxx]:19359/dash/[stream name]

这里的 [stream name] 是可以自己定义个名称,不过播放地址要跟这个对应,比如对应以上视频流的播放地址为:

  • SRS 的 RTMP 拉流地址:rtmp://[xxx.xxx.xxx.xxx]:1935/live/[stream name]
  • SRS 的 HTTP-FLV 拉流地址:http://[xxx.xxx.xxx.xxx]:8080/live/[stream name].flv
  • Nginx DASH 拉流地址:http://[xxx.xxx.xxx.xxx]:8085/dash/[stream name].mpd
  • Nginx HLS 拉流地址:http://[xxx.xxx.xxx.xxx]:8085/hls/[stream name].m3u8

如果这些服务都正常工作的话,就可以测试推流和播放了,比如利用类似如下 ffmpeg 脚本进行推流:

ffmpeg -re -i media.flv -c copy -f flv rtmp://[xxx.xxx.xxx.xxx]:1935/live/[stream name]
ffmpeg -re -i media.mp4 -vcodec libx264 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://[xxx.xxx.xxx.xxx]:1935/live/[stream name]

播放测试也可以利用 ffmpeg,比如:

ffmpeg -f flv -i rtmp://[xxx.xxx.xxx.xxx]:1935/live/[stream name] -f flv -y /dev/null

当然,另一个推流广泛使用的免费工具就是 OBS (Open Broadcaster Software),支持 Windows/MacOS 以及 Ubuntu系统,下载地址,在后面的效果展示中,我们来看看它的强大功能;

成果展示

经过两天的时间调试,整个直播流程顺利走通,所有的 HTTP 方式的直播流都通过 CDN(AWS Cloudfront)进行分发,在 Mac 和移动端的浏览器里面都能正常工作,也试验了 OBS 个人直播频道,非常酷炫,见下文的说明。

演示页面

为了更好的展示效果,我结合 CDN 做了一个站点,https://xyzy.nwcdclub.cn/, 该站点上有 四个直播频道,其中有三个直播频道是后台循环推送固定的教学或娱乐视频,最后一个“个人频道”,供实时推流直播演示,平时没有直播流;需要演示的同学可以微信我,索要推流地址和一起探讨

DemoSite

OBS 人生第一次个人直播秀

第一次使用 OBS,直播的时候,可以选择整合本地视频,摄像头,图片,等非常多的内容到一个直播发布,尝试了将摄像头,PPT,VLC视频播放,文字,VSCode界面整合在一起的效果,效果非常赞,见下图没有声音的 gif 动画:

OBS推流

手机浏览器的 HTML5 播放效果:

个人直播流手机侧播放

如何制作一个 7x24 小时直播频道?

本质上只要直播源一直在发布就可以做到 7x24,本文基于 ffmpeg 后台任务,设定一个最大循环直播数,利用 Linux Shell 的 Wait 命令,等待一个直播结束,接着再启动一个直播,如果直播发布没有任何错误发生,将一直循环到最大播放数。

#!/bin/bash

#### 用法:在后台一直运行交付一个 7x24 的循环直播平台
#### nohup simulator >/dev/null 2>&1 &
#### jobs -l

count=1
while [ $count -lt 24000 ]
do
   echo "第 $count 次循环直播:"


   echo "频道1:nginx module - hls"
   nohup ffmpeg -re -i videos/media4-1080p.mp4 -c copy -f flv rtmp://127.0.0.1:19359/hls/nginxmodule >nginxhls.log &
   process_id=$!

   wait $process_id
   status1=$?

   count=`expr $count + 1`
   if [ $status1 -ne 0 ]
   then
     echo "有错误发生,直播结束"
     exit 0
   fi
done

SRS 管理页面

SRS 前文提到,服务器端,它支持集群方式高可用部署,比较适合生产场景,而且,还自带了一个控制台,可以了解到媒体服务器的基本情况,包括直播流,在线人数,等等: SRS Console

后记

读万卷书不如行万里路,虽然不能跟在直播行业的客户比实际经验,但通过梳理直播理论和动手实践,对直播技术会有更切身的体会,这次的动手,没想到最后会做成一个可以实际演示的公开站点,还做了些页面美化,结合 CDN,远远超出原来的设想,码字不容易,搬砖更不容易,如果对你有所启发,转发是对我最大的鼓励。

资源引用


公众号二维码

诞生于 2019,遇见 2020。

感谢关注,欢迎动动手指标星和置顶;

这样就不会错过少但精彩的技术探讨、团队建设、案例分享!

每周至少一更,转发是对我的最大鼓励!

学习之路漫漫,走走停停,
偶有所感,随心所记,
言由心声,问心无愧!

从客户中来,到客户中去!