使用Nginx推流多个直播平台解决方案

6,839 阅读2分钟

一、业务场景

最近公司的直播业务中,接入了多个第三方的直播服务(网易云信和腾讯云),公司使用OBS进行推流,需要同时推流到两个平台,但是一个OBS自身只能推流到一个地址,从而需要有新的解决方案。

根据该业务场景调研了网上大家常用的三种方案:

1.多个OBS:

一台电脑使用多个OBS推送,但是由于OBS需要利用CPU进行转码,开启两个OBS会占据CPU大量资源,从而可能出现转码过载,导致直播掉帧

2. 利用第三方流媒体服务

利用第三方流媒体服务,将OBS推送到第三方服务器,第三方服务器再推送到配置到多个平台信息信息,但是此问题需要依赖第三方推流服务,第三方服务器是否稳定会直接影响直播效果

3. 搭建本地nginx服务器

搭建本地Nginx服务器,利用OBS将视频流推送到本地Nginx服务器,再利用Nginx服务器进行转发到各平台

当然,应该还有其他的解决方案,但是自己对视频流这一块简直就是小白,公司对实现的进度要求也比较紧急,所以在有限时间内发现的三种方案中,选择了Nginx的方案实践(选择原因:相对来说对目前对推流过程变化较小,同时成本也较低),并成功实现了推流到多个平台的需求。

二、实现方案(MacOS下)

由于电脑是MacOS,所以基于MacOSNginx分流方案,具体实现方案分为以下三步:

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推多个直播平台

----------- 08.06追加 -----------

执行脚本,将内容调整保存为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 '配置成功!'