申明
本站点所有文章,仅代表个人想法,不代表任何公司立场,所有数据都来自公开资料
转载请注明出处
这是直播平台技术的第二篇,在第一篇《聊直播,这些知识点你必须要懂》我们初步了解了直播的基本架构以及常用术语,有朋友问,我想自己搭建一个直播平台,该怎么玩?
没错,纸上得来终觉浅,出于好奇,我们一起来试试,如何用开源方案+云平台搭建一个直播平台?
准备工作
为了实现如下直播架构,我们需要准备哪些工具?
要搭建这样的一个直播平台,需要准备:
- 一个云主机:为了托管媒体服务器,本文使用 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/, 该站点上有 四个直播频道,其中有三个直播频道是后台循环推送固定的教学或娱乐视频,最后一个“个人频道”,供实时推流直播演示,平时没有直播流;需要演示的同学可以微信我,索要推流地址和一起探讨
OBS 人生第一次个人直播秀
第一次使用 OBS,直播的时候,可以选择整合本地视频,摄像头,图片,等非常多的内容到一个直播发布,尝试了将摄像头,PPT,VLC视频播放,文字,VSCode界面整合在一起的效果,效果非常赞,见下图没有声音的 gif 动画:
手机浏览器的 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 前文提到,服务器端,它支持集群方式高可用部署,比较适合生产场景,而且,还自带了一个控制台,可以了解到媒体服务器的基本情况,包括直播流,在线人数,等等:
后记
读万卷书不如行万里路,虽然不能跟在直播行业的客户比实际经验,但通过梳理直播理论和动手实践,对直播技术会有更切身的体会,这次的动手,没想到最后会做成一个可以实际演示的公开站点,还做了些页面美化,结合 CDN,远远超出原来的设想,码字不容易,搬砖更不容易,如果对你有所启发,转发是对我最大的鼓励。
资源引用
诞生于 2019,遇见 2020。
感谢关注,欢迎动动手指标星和置顶;
这样就不会错过少但精彩的技术探讨、团队建设、案例分享!
每周至少一更,转发是对我的最大鼓励!
学习之路漫漫,走走停停,
偶有所感,随心所记,
言由心声,问心无愧!
从客户中来,到客户中去!