使用nginx-rtmp-module搭建RTMP直播服务器

注:本文环境默认为linux
首先需要下载
nginx-1.8.1
nginx-rtmp-module

因为nginx-rtmp-module对nginx的版本限制比较大,所以最好使用上面给出的nginx版本。

安装nginx
1.首先下载安装nginx-1.8.1

//也可以电脑上下载完后上传到服务器
wget http://nginx.org/download/nginx-1.8.1.tar.gz

2.安装依赖

yum apt-get update
yum apt-get install libpcre3 libpcre3-dev 
yum apt-get install openssl libssl-dev

3.解压

tar -zxvf nginx-1.8.1.tar.gz -C /usr/local/live

4.配置

//改变默认监听端口(进入nginx解压后根目录),找到下图位置,修改端口号
vi conf/nginx.conf
i
编辑....
ESC
shift+q
x

这里写图片描述

5.添加nginx-rtmp-module模块并编译安装
将下载的nginx-rtmp-module文件解压,进入第3步解压完的nginx-1.8.1文件夹中

./configure --add-module=../nginx-rtmp-module-master --prefix=/usr/local/live/nginx
make
make install

6.运行nginx,进入第5步安装完后的nginx文件

./sbin/nginx

浏览器出现如下界面就表示nginx安装成功了,url为 http:// + 服务器 ip + : + 第4步改的端口号
这里写图片描述

搭建流媒体服务器相关配置
1.继续上面的第4步

events {
    worker_connections  1024;
}
//...................
//添加的部分
rtmp {
    server {
        listen 8001;#之后推流拉流的端口
        chunk_size 4096;

        application live {  #
            live on;
        }
    }
//...................
}
server {
        listen       8000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #...................
        #添加的部分
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            #为nginx-rtmp-module解压的地址
            root /usr/local/live/nginx-rtmp-module-master/;
        }
        #...................
        location / {
            root   html;
            index  index.html index.htm;
        }
    }

配置完成后重启nginx

./sbin/nginx -s reload

浏览器url: http:// + 服务器ip +: + 端口号 + /stat
出现下方红框部分则配置成功
这里写图片描述

这时候就可以试试推流给流媒体服务器了。
我这里是使用ffmpeg将保存在服务器上的mp4文件推成rtmp流来测试的,大家也可以使用OBS来生成rtmp推流。
讲下ffmpeg吧,之后还会使用ffmpeg实现在线转流服务。

ffmpeg安装配置
因为之前写的博客中有涉及到ffmpeg安装,所以这里就直接放上链接了
ffmpeg安装

ffmpeg推流本地MP4文件
因为我没有把ffmpeg加入到环境中,所以就直接用路径运行了,
/usr/local/ffmpeg为我的服务器ffmpeg安装路径。
新建/usr/local/live/video文件夹用来放置测试用的MP4文件。
rtmp://172.16.253.146:8001/live/test 推流路径 8001 就是上面配置rtmp的监听端口,live为application配置号,test可以随便取名

/usr/local/ffmpeg/bin/ffmpeg -re -i /usr/local/live/video/1.mp4 -vcodec copy -acodec copy -f flv rtmp://172.16.253.146:8001/live/test

执行上面命令后控制台的大致样子
这里写图片描述

此时ffmpeg正将MP4文件以rtmp协议推送给上面的nginx流媒体服务器,此时可以进入 http:// + 服务器ip +: + 端口号 + /stat 网页查看信息
如下图,先不要看红框中的,应该会出现蓝框中的信息,publishing,就是推流端,可以看到有一个流正在一直被推送给nginx服务器
这里写图片描述

然后可以使用播放器收看该直播流,这里推荐时用VLC,这个百度下就能下到,所以也不放出下载地址了。
VLC收看直播流
这里写图片描述

填入上面推流的url:rtmp://172.16.253.146:8001/live/test
这里写图片描述

就可以收看刚才推送的MP4文件直播了
这里写图片描述

然后回到刚才的页面,刷新下就可以看到多了一个play流,即有一个播放端在播放该RTMP流,如下图,先无视掉蓝框中的东西(那些是在线转码时用到的),红框中出现了一个play,地址正是我用VLC播放直播流的PC IP地址。
这里写图片描述

实际直播时可以使用PC 上的OBS等软件录制直播发送推流给nginx服务器,或者什么微信小程序等等都可以,之后有空会讲下微信小程序录制直播流和观看直播流的相关操作。

ffmpeg在线转流
因为实际直播中,因为网络等因素,在网络联通不流畅时就需要看清晰度低一些的直播,所以还需要提供多个不同清晰度的直播流来供观众选择。因此在线转流也是必须的,这是我们可以看下nginx-rtmp-module作者所给出的功能介绍:
这里写图片描述

ffmpeg在线转码。
因为之前我也有使用ffmpeg的经历,所以也就直接拿来用了。
对照作者给出的使用方式模板:

 # Transcoding (ffmpeg needed)
        application big {
            live on;

            # On every pusblished stream run this command (ffmpeg)
            # with substitutions: $app/${app}, $name/${name} for application & stream name.
            #
            # This ffmpeg call receives stream from this application &
            # reduces the resolution down to 32x32. The stream is the published to
            # 'small' application (see below) under the same name.
            #
            # ffmpeg can do anything with the stream like video/audio
            # transcoding, resizing, altering container/codec params etc
            #
            # Multiple exec lines can be specified.

            exec ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32
                        -f flv rtmp://localhost:1935/small/${name};
        }

        application small {
            live on;
            # Video with reduced resolution comes here from ffmpeg
        }

就能很轻松的进行配置。
我这里设置了3个不同的清晰度,720,480,360,当然使用的ffmpeg命令只是示范,为了更好的效果是需要调整的,配置如下:
修改之前添加的live

application live {
            live on;
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 720x405 -f flv rtmp://172.16.253.146:8001/live720/${name};
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 480x270 -f flv rtmp://172.16.253.146:8001/live480/${name};
            exec /usr/local/ffmpeg/bin/ffmpeg -re -i rtmp://172.16.253.146:8001/live/$name -vcodec flv -acodec copy -s 360x202 -f flv rtmp://172.16.253.146:8001/live360/${name};
        }
        application live720{
            live on;
        }
        application live480{
            live on;
        }
        application live360{
            live on;
        }

重启nginx服务器,进入页面
http:// + 服务器ip +: + 端口号 + /stat
可以看到如下,test为原始流,然后转码为其他3个不同清晰度的rtmp流,可以试试使用VLC播放4个流。
这里写图片描述

我这里看确实分辨率下降了非常多,截图可能看不出
这里写图片描述

另外ffmpeg还提供了将rtmp流保存为MP4文件等等功能,所以我么也可以根据需要来定制自己的服务。当然nginx-rtmp-module自身也可以进行相应配置将流保存到本地等等功能,这些可以去作者的博客&github自己查看文档。
nginx-rtmp-module有一个缺点是不支持集群,关于这里应该如何进行架构设计可以参考 如何从零开始搭建高性能直播平台 这里不再深入。

猜你喜欢

转载自blog.csdn.net/yeyinglingfeng/article/details/79443373