最近有“直播”的需求,需要使用OBS进行推流,但不方便在公共平台上进行直播。因此我决定自建服务器来进行推流与转换。

虽然可以选择腾讯云/阿里云的商业推流服务,但因为没钱所以我决定使用自建。

最开始我选择的是使用monibuca项目,但因为它是go写的,我对go一窍不通,尝试搭建后发现有内存溢出的问题,并且我对外服务的人数并不算多,因此在monibuca项目完全稳定之前我就用nginx来进行推流吧。
nginx真的是神器

我的需求是OBS录屏 - RTMP推流 - 转换成HLS - WEB(博客)播放
下面这张图能很完美的体现我的需求:
RTMP推流

前置需求

1.国内高带宽服务器,最低上传带宽需求10Mbs,如果没钱买vps的话,家宽也是不错的选择。国外的GIA的服务器或许可以,但我目前没有空余的GIA服务器,因此还是用的家宽。
2.nginx对cpu和内存需求较低,实测2h2g完全足够,甚至1h1g也足够。
3.能自行搜寻解决问题的能力。因为我这个仅供我自己备忘,因此不会写保姆级教程,只会写我实现的经过以及发现的问题、对应的解决方法。

关于什么是直播服务器建议看monibuca大佬的OSC源创会

部署

安装环境

我习惯使用appnode,并且appnode的nginx内带有rtmp模组,因此我就不编译安装了。
安装appnode(安装nginx) - 创建纯静态运行环境 - 软件管家 - nginx - 扩展管理 - 搜索rtmp - 勾选后立即安装

编辑配置

由于appnode的网站管理无法管理rtmp组件,因此需要单独配置nginx的配置文件。
配置前nginx应该是安装了rtmp模组,并且正常启动。

网站管理 - 组件管理 - nginx(设置) - 扩展管理 - 启用RTMP(默认安装了没启用) - 全局源文
全局源文即为nginx.conf,以下内容即使你是编译安装的也可以参考使用。

rtmp {
    server {
        listen 1935;#rtmp 端口  1935为nginx 默认端口
        application live {
            live on;#直播开启

            hls on;#hls 开启
            hls_path /tmp/hls/;#hls 的m3u8索引文件存储  这个地方需要给到nginx的目录操作权限
            hls_fragment 5s;#hls 每片长度为5秒
      #边播边存配置,如无需求最好别开,免得你忘了删
      recorder rec{
        record all;   #存储所有,包括视频及音频
        record_unique on;  #是否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为 off。
        record_path /home/live/record/;   #录制文件存储地址配置  这个地方需要给到nginx的目录操作权限
        record_suffix -%Y-%m-%d-%H_%M_%S.flv;   #录制存储文件名字配置
              }
        }
    }
}

添加到http之前,如下所示:
nginx-rtmp配置

hls

nginx支持生成m3u8文件,进而进行播放,因此不需要使用ffmpeg进行转换
我的直播临时目录为/tmp/hls/,因此你可以创建网站,然后将/tmp/hls/软链接到网站目录内,我软链接的文件夹为hls。

ln -s /tmp/hls /data/live/sites/hls/www/hls

最好网站是以目录形式,即删掉: index index.html index.htm index.php;
为了后文,我假设我创建的网站为:hls.eve.pub,是否使用https无所谓。

如果你也是用的appnode,记得允许跨域,不然不能嵌入网页播放。

使用

rtmp推流

obs使用自动配置向导,其中推流服务选择自定义:

服务器:rtmp://192.168.16.17:1935/live/
串流密钥:12345

解释如下:

rtmp - 使用rtmp协议,不要像我最开始接触的时候填成了http
192.168.16.17 - 服务器ip地址
1935 - 1935为rtmp默认端口,可以省略不填
live - 为上文nginx配置中的application xxx 的内容,为流名称
12345 - 可以看作是“房间”,为流密钥

vlc拉流

vlc支持rtmp协议的拉流,路径:
打开媒体 - 打开网络
填入:

rtmp://192.168.16.17/live/12345

其实就是:服务器+串流密钥。

m3u8地址

上文创建的网站:hls.cve.pub
软链接的文件夹为:hls
串流密钥为:12345
则m3u8文件直链为:http(s)://hls.cve.pub/hls/12345.m3u8

m3u8文件需要过几秒才能生成,你开始直播后一分钟再使用吧

测试

我懒得再搭一个网站了,就在这测试吧。


Monibuca快速起步
搭建基于nginx的rtmp直播服务器
Nginx与Nginx-rtmp-module搭建RTMP视频直播和点播服务器
arut/nginx-rtmp-module
Ubuntu下Nginx rtmp直播 hls http m3u8 及 直播录制

最后修改:2023 年 06 月 22 日
如果觉得我的文章对你有用,请随意赞赏