最近公司的直播业务中,接入了多个第三方的直播服务(网易云信和腾讯云),公司使用OBS
进行推流,需要同时推流到两个平台,但是一个OBS
自身只能推流到一个地址,从而需要有新的解决方案。
根据该业务场景调研了网上大家常用的三种方案:
1.多个OBS:
一台电脑使用多个OBS
推送,但是由于OBS
需要利用CPU进行转码,开启两个OBS
会占据CPU大量资源,从而可能出现转码过载,导致直播掉帧
2. 利用第三方流媒体服务
利用第三方流媒体服务,将OBS
推送到第三方服务器,第三方服务器再推送到配置到多个平台信息信息,但是此问题需要依赖第三方推流服务,第三方服务器是否稳定会直接影响直播效果
3. 搭建本地nginx服务器
搭建本地Nginx
服务器,利用OBS
将视频流推送到本地Nginx
服务器,再利用Nginx
服务器进行转发到各平台
当然,应该还有其他的解决方案,但是自己对视频流这一块简直就是小白,公司对实现的进度要求也比较紧急,所以在有限时间内发现的三种方案中,选择了Nginx
的方案实践(选择原因:相对来说对目前对推流过程变化较小,同时成本也较低),并成功实现了推流到多个平台的需求。
由于电脑是MacOS
,所以基于MacOS
的Nginx
分流方案,具体实现方案分为以下三步:
1. 安装brew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
复制代码
统一对系统插件包管理
2. 安装nginx
brew tap denji/nginx
brew install nginx-full --with-rtmp-module
brew info nginx-full
复制代码
注意,这里两个操作:
第一,使用了brew tap denji/nginx
,因为需要安装包含rtmp
模块的nginx
,直接安装会发生安装错误,所以这里需要使用
第二,安装时一定要安装rtmp
模块,用于配置rtmp
配置
3. nginx配置文件追加配置
安装Nginx后配置文件地址:/usr/local/etc/nginx/nginx.conf
,配置文件中追加rtmp
配置
rtmp {
server {
listen 1935;
chunk_size 10240;
application live {
live on;
record off;
push rtmp://p4275c5f7.live.126.net/live/377faa0e54d84db49de0239805f858e8?wsSecret=d25c205a7ab8620ec2078fa11301c4a2&wsTime=1563965458;
push rtmp://pushschool.icourt.cc/live/619fb940aac711e98ab27cd30aeb1494?txSecret=5e58356cd2fcc3384b258637a3d8fc90&txTime=5D3C74FF;
}
}
}
复制代码
其中,push
是需要推送的平台直播地址。
4. 其他
由于因为推流地址会经常发生变化,操作人员是不熟悉技术的同事,所以在Nginx
配配置文件夹中,增加了conf
文件夹,使用include
的方式,引用Nginx
配置文件,直接修改配置文件后,执行nginx -s reload
重新加载配置文件即可
rtmp {
server {
listen 1935;
chunk_size 10240;
application live {
live on;
record off;
include ./conf/push.conf
}
}
}
复制代码
总的来说对于开发人员操作流程很简单,然而对于非开发人员来说,配置Nginx
服务器的方案也存在了一些技术壁垒,所以会考虑在之后提供一份shell
脚本直接进行安装,后期可能整合Nginx
,提供提供可操作界面的软件,希望自己能完成这个立下的flag
如何配置Nginx推多个直播平台
执行脚本,将内容调整保存为install.command
,其中安装nginx-full的课程可能存在下载比较缓慢,如果有问题可以重复执行:
echo '安装homebrew'
if command -v brew; then
echo '已经找到了homebrew,现在尝试进行更新 >>> '
echo '替换 brew.git 仓库地址>>> '
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
echo '替换 homebrew-core.git 仓库地址>>> '
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
echo 'brew 更新中...'
cd "$(brew --repo)"
git pull origin master
brew update
echo '还原 brew.git 仓库地址>>>'
cd "$(brew --repo)"
git remote set-url origin https://github.com/Homebrew/brew.git
echo '还原 homebrew-core.git 仓库地址'
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://github.com/Homebrew/homebrew-core.git
else
echo '未找到homebrew,开始安装 >>> '
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi
echo '检查 nginx-full 安装情况 >>> '
if command -v nginx; then
echo 'ngxin-full 已经安装 >>> '
else
echo '开始安装 nginx-full >>> '
brew tap denji/nginx
brew install nginx-full --with-rtmp-module
fi
echo '开始配置 nginx.conf >>> '
cd /usr/local/etc/nginx
mkdir conf
touch conf/push.conf
echo '
rtmp {
server {
listen 1935;
chunk_size 10240;
application live {
live on;
record off;
include ./conf/push.conf
}
}
}
' >> nginx.conf
echo '打开 push.conf 所在目录,配置相关命令行文件'
touch conf/reload.command
chmod 777 conf/reload.command
echo 'nginx -s reload' >> reload.command
open conf
echo '设置 nginx 开机启动 >>>'
brew services start denji/nginx/nginx-full
echo '配置成功!'