基于nginx-rtmp-module搭建直播系统

1. nginx基础

在这里插入图片描述
在这里插入图片描述

2. nginx-rtmp-module基础

在这里插入图片描述

3. 实验操作

3.1 安装nginx

从官网下载稳定版本 nginx:http://nginx.org/en/download.html

tar -zxvf nginx-1.12.0.tar.gz

然后使用configure进行配置,该脚本定义系统的各方面配置,最终输出makefile文件

cd nginx-1.12.0
./configure

nginx 源码编译安装的方式依赖:zlib, pcre, openssl 库

编译安装

make && make install

验证是否安装成功

/usr/local/nginx/sbin/nginx -v

3.2 NRM的搭建

首先需要从github上下载rmtp模块:https://github.com/arut/nginx-rtmp-module/releases

配置nrm到nginx中

./configure --add-module=/User/xiaopeng/NRM --prefix=/usr/local/nginx --with-debug 

make && make install

拷贝一份nginx.conf 命名为 live.conf ,配置RTMP直播,具体内容参考如下

worker_processes  1;

events {
    worker_connections  1024;
}

rtmp {
    server {
        listen 1935;
        application mylive {
            live on;
	}
    }
}

http {
    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       8888;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

验证安装
在这里插入图片描述
启动nginx

./nginx -c /xx/xx/live.conf # 自己的nginx配置位置

3.3 推流

使用了ffmpeg工具,具体安装方法为:(以mac为例)

brew install ffmpeg

随机从本地挑出一个视频文件作为测试,使用ffmpeg推流工具:

ffmpeg -re -stream_loop -1 -i finereportvideo.mp4 -r 25 -b 4M -f flv rtmp://192.168.199.208:1935/mylive/6

3.4 拉流

使用ffplay工具进行拉流测试:

ffplay "rtmp://192.168.199.208:1935/mylive/6" # 注意具体位置为自己局域网的ip地址和地址

这样就可以在局域网内通过该rtmp地址观看直播了。

3.5 实验效果展示

在局域网内的两个pc端同时观看该直播:
在这里插入图片描述

3.6 如何使用NRM支持HLS直播

  • 在本地创建一个目录用于保存m3u8和ts文件
    mkdir /Users/xiaopeng/m3u8file
    
  • 修改/usr/local/nginx/conf/live.conf配置文件
rtmp {
    server {
        listen 1935;

        application mylive {
            live on; # 开始直播
            hls on; # 开启hls直播
            hls_path /Users/xiaopeng/m3u8file; # 配置hls m3u8文件存放地址

        }
    }
}
  • 由于hls协议是基于HTTP协议的,所以无法通过RTMP协议去访问HLS m3u8文件,因此在nginx的http上下文部分,需要增加配置以支持访问m3u8文件。
 server {
        listen       8888;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /mylive_hls {
            types {
                application/vnd.apple.mpegurl m3u8; # m3u8配置
                video/mp2t ts; # ts分片配置
            }
            alias /Users/xiaopeng/m3u8file; # 指向m3u8文件目录
            add_header Cache-Control no-cache; # 禁止缓存
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
  • 推流
ffmpeg -re -stream_loop -1 -i finereportvideo.mp4  -vcodec libx264 -acodec aac -f flv rtmp://192.168.199.208:1935/mylive/44
  • 使用ffplay测试播放,输入如下地址
ffplay "http://192.168.199.208:8888/mylive_hls/44.m3u8"
  • 可以检查文件目录/Users/xiaopeng/m3u8file是否有m3u8以及ts文件的输出
    在这里插入图片描述
    可以发现,通过HLS的相关配置,可以轻松访问到m3u8和ts文件,通过location和type中配置客户端,可以通过基于http协议来访问m3u8和ts文件播放流媒体。

4. nginx-rtmp-module进阶

4.1 推/拉流与串流码

在直播技术中,会涉及推流和拉流。
所谓推流:将流媒体推送到流媒体服务器的过程;
所谓拉流:将服务器获取视频数据的过程。

在上面的实验中,将一个视频文件推送到本地搭建的RTMP服务器地址命令行:

ffmpeg -i my.mp4 -vcode 视频编码库 -acodec 音频编码库 -f -flv rtmp://xxxx

需要说明的是,application之后的参数即为串流码,被用来区分不同的直播流。
在这里插入图片描述
对于上述例子,application为mylive,串流码为44.

又例如,下面的三路直播流地址,第一个和第三个虽然流串码相同,但是application不同,故也为不同的直播流:

rtmp://127.0.0.1:1935/live/123
rtmp://127.0.0.1:1935/live/234
rtmp://127.0.0.1:1935/lv/123

4.2 Control控制器

control控制器是http模块中,基于http协议从外部来控制rtmp的模块。通过control控制器,就可以使用诸如record、drop和redirect的命令来实现不同业务需求。

需要修改的配置文件位于nginxhttp server标签中,在server listen 8888(每个人端口可能不同) 标签下增加location/control 并设置为 rtmp_control all,这样就开启了控制器模块在http下的通道:

...

    server {
        listen       8888;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location /mylive_hls {
            types {
                application/vnd.apple.mpegurl m3u8; # m3u8配置
                video/mp2t ts; # ts分片配置
            }
            alias /Users/xiaopeng/m3u8file; # 指向m3u8文件目录
            add_header Cache-Control no-cache; # 禁止缓存
        }

        # 开启控制器模块在http下的通道
        location /control {
            rtmp_control all;
        }

        error_page   500 502 503 504  /50x.html;
...
命令功能描述
record实现录制与停止直播流功能
drop有选择地踢出推流用户或拉流用户
redirect有选择地重定向推流用户或拉流用户
4.2.1 record命令

使用示例

如何实现直播业务中录制直播流的功能?

  • live.conf的配置参考

首先需要找一个地方存储录制的文件:这里我存放在/Users/xiaopeng/records

rtmp {
    server {
        listen 1935;

        application mylive {
            live on; # 开始直播
            hls on; # 开启hls直播
            hls_path /Users/xiaopeng/m3u8file; # 配置hls m3u8文件存放地址
            hls_fragment 2s;
            hls_playlist_length 16s;

            # 录制直播流相关配置
            recorder myRecord {
                record all manual;
                record_suffix _.flv;
                record_path /Users/xiaopeng/records;
            }
        }
    }
}
  • 推流
ffmpeg -stream_loop -1 -i finereportvideo.mp4  -c:v libx264 -c:a aac -f flv rtmp://192.168.199.208:1935/mylive/77
  • 开启录制url
curl "http://192.168.199.208:8888/control/record/start?app=mylive&name=77&rec=myRecord"

可以看到上述配置的录制文件夹下存在录制的视频flv格式文件:
在这里插入图片描述

  • 停止录制
    只需要将请求的url中的start替换成stop:
curl "http://192.168.199.208:8888/control/record/stop?app=mylive&name=77&rec=myRecord"

常用配置

配置项说明用法实例
rtmp_stat数据流统计模块,可以通过url实时监控流媒体的各种状态在这里插入图片描述
record用来设定录制媒体选项命令在这里插入图片描述
record_path用于录制文件的输出路径在这里插入图片描述
record_suffix设置录制文件输出的文件名称在这里插入图片描述
record_unique将当前时间戳添加到已被记录的文件中record_unique on
record_append用于将新数据追加到旧文件中,或者当已录制的文件丢失时创建它,注意它和unique,suffix配置有冲突record_append on
record_max_size最大录制文件的大小record_max_size 5000KB
4.2.2 drop命令

在这里插入图片描述

4.2.3 redirect命令

在这里插入图片描述

更加详细的官方指令文档参考: https://github.com/arut/nginx-rtmp-module/wiki/Directives
视频的基础知识参考: https://zhuanlan.zhihu.com/p/61747783

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值