五、nginx-rtmp-module进阶

1. 前言

前面几张主要讲解了nginx、nginx-rtmp-module、ffmpeg的环境搭建以及我们成功搭建了第一个直播系统。这一章主要介绍如何配置一个基于HLS协议的直播系统,以及m3u8与ts文件的配置,然后逐渐深入介绍NRM与直播系统的高级应用。

2. 如何使用NRM支持HLS协议直播

2.1 为m3u8文件创建一个预备目录

[root@localhost ~]# mkdir /usr/local/m3u8File

2.2 修改配置文件

[root@localhost ~]# vim /usr/local/nginx/conf/live.conf 
# 修改以下内容
        application mylive {
            live on; # 开启直播
            hls on;  # 开启HLS直播
            hls_path /usr/local/m3u8File; # 配置HLS m3u8文件存放地址
         }

在这里插入图片描述
修改完后记得重启nginx。
因为HLS协议是基于HTTP协议的,所以我们无法通过RTMP协议头访问HLS m3u8文件,因此,下面在http标签下配置它的访问操作。

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

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

        location /mylive_hls {
            types {
                # m3u8 type设置
                application/vnd.apple.mpegurl m3u8;
                # ts分片文件设置
                video/mp2t ts;
            }
            alias /usr/local/m3u8File;
            add_header Cache-Control no-cache; # 禁止缓存
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

在这里插入图片描述

2.3 推流

执行推流命令,这里额外配置了视频编码器libx264与音频编码器aac。

[root@localhost nginx]# ffmpeg -re -i /opt/video/cs.mp4 -vcodec libx264 -acodec aac -f flv rtmp://192.168.5.133:1935/mylive/44

通过前面的配置,可以知道m3u8和ts文件被存放在/usr/local/m3u8File目录下,查看这个目录可以得知是否有m3u8及ts文件输出,如下所示。
在这里插入图片描述
然后通过VLC播放HLS流媒体,如下所示。
在这里插入图片描述
可以看到,通过HLS相关配置,我们可以轻松地得到m3u8和ts文件了,再通过location与type中的配置客户端,就可以通过HTTP协议访问m3u8和ts文件播放流媒体了。

3. 推/拉流与串流码

在直播技术中,经常会涉及推流(Push)和拉流(Pull)。将流媒体推送至流媒体服务器的过程叫做推流。向服务器获取视频数据的过程叫做拉流。

# 将my.mp4 推送到RTMP服务器
ffmpeg -re -i my.mp4 -vcodec 视频编码库 -acodec 音频编码库 -f -flv rtmp://xx

在直播地址中,application之后的参数就是串流码(Stream Key),它用来区分同一个application中不同的直播流。
以下三条互不影响的直播流是三路直播流,虽然第一条与第三条串流吗相同,但是因为application不同,所以它们也是独立互不影响的直播流。

1. rtmp://192.168.5.133:1935/live/123
2. rtmp://192.168.5.133:1935/live/234
3. rtmp://192.168.5.133:1935/lv/123

4. Control控制器

Control控制器是http模块,它可以通过HTTP协议从外部控制rtmp模块。通过Control控制器,我们可以使用record、drop和redirect这3个命令来实现我们的业务场景。
我们要做的仅仅是将以下location添加到http server标签中,如下所示。这里再server linten 80标签下增加了一个location/control 并设置rtmp_control all。这样我们就开启了控制器模块在http下的通道。

location /control {
      rtmp_control all;
}

在这里插入图片描述

4.1 record命令

通过record命令,可以实现录制与停止直播流功能。

1. 示例

下面先来一个最简单的实现录制直播流的配置示例。

        application mylive {
            live on; # 开启直播
            hls on;  # 开启HLS直播
            hls_path /usr/local/m3u8File; # 配置HLS m3u8文件存放地址
            hls_fragment 2s;
            hls_playlist_length 16s;
            recorder myRecord {
                record all manual;
                record_suffix _.flv;
                record_path /tmp/rec;
            }
         }

在这里插入图片描述
首先手动创建一个目录 mkdir /tmp/rec,再执行ffmpeg推流命令,然后请求开启录制的URL。

[root@localhost ~]# mkdir /tmp/rec
# 执行推理命令
[root@localhost nginx]# ffmpeg -re -i /opt/video/cs.mp4 -c:v libx264 -c:a aac -f flv rtmp://192.168.5.133:1935/mylive/77

浏览器输入:http://192.168.5.133/control/record/start?app=mylive&name=77&rec=myRecord 执行开启录制URL。
执行程序后页面返回/tmp/rec/77_.flv文件。我们在/tmp/rec 目录下并没有发现有录制的文件。通常是因为授予文件夹访问权限不够高,无法在rec目录中进行创建文件及写入操作。通过使用 chmod -R 777 /tmp 对目录进行授权,然后再执行录制,成功录制文件。如下所示。

[root@localhost rec]# chmod -R 777 /tmp

在这里插入图片描述
录制成功。那么如何停止录制呢?很简单,将URL中的start替换成stop即可。

2. 常用配置

(1)rtmp_stat
rtmp_stat 是流数据统计模块,在http模块中配置它,可以通过URL实时监控流媒体状态。
示例如下:

        location /liveStat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            root /download/NRM/;
        }

在这里插入图片描述
(2)record
下面是record配置中最基础的功能,用来设置录制媒体选项命令,如下所示。

命令功能
[off,all,audio,video,keyframes,manual] off关闭录制音频与视频
all录制音频与视频
audio仅录制音频
video仅录制视频
keyframes仅记录关键帧
manual手动开启和关闭录制(默认自动录制)

示例如下:

    record all manual; #手动控制,记录音/视频
    record audio;      #自动控制,记录音频

(3)record_path
record_pth 用于设置录制文件的输出路径。
示例如下:

    record_path /xxx/xx;

(4)record_suffix
record_suffix 用于设置录制文件输出的文件名。如下代码所示,NRM会将“{1}”的位置自动替换为Stream Key,因此,我们可以设置个性的文件名格式规范(支持strftime函数)。
示例:

    record_suffix {1}.flv;

(5)record_unique
record_unique 用于将当前时间戳添加到已被记录的文件中,避免在每次产生新记录时,重写文件。record_unique默认是关闭的,其输出格式为{StreamKey}-{log time},例如77-1517192930.flv。
示例如下:

	record_unique on;

(6)record_append
record_append用于将新文件追加到旧文件中,获取当已录制的文件丢失时创建它。record_append默认是关闭的。因此,append与unique、suffix的配置有所冲突,因为unique与使用了strftime函数的suffix总会生成一个不同的文件名,因此,append的追加也就没有意义了。
示例:

	record_append on;

(7)record_max_size
record_max_size 是指最大录制文件的大小,当录制的文件超过设置的数值时,文件将会被清空,然后写入后续的数据。

	record_max_size 5000kb;

4.2 drop命令

在配置了 control 选项后,可以通过drop命令有选择地踢出推流用户或拉流用户。

# 踢出推流用户
http://192.168.5.133/control/drop/publisher?app=mylive&name=777
# 踢出全部拉流用户
http://192.168.5.133/control/drop/subscriber?app=mylive&name=777
# 根据IP踢出拉流用户
http://192.168.5.133/control/drop/client?app=mylive&name=777&addr=172.26.22.4
# 根据序号踢出该拉流用户
http://192.168.5.133/control/drop/client?app=mylive&name=777&clientid=1

4.3 redirect命令

可以通过redirect命令有选择地重定向推流用户或拉流用户。

# 重定向推流地址到newname
http://192.168.5.133/control/redirect/publisher?app=mulive&name=777&newname=1
# 重定向全部拉流用户到新流
http://192.168.5.133/control/redirect/subscriber?app=mylive&name=777&newname=1

当然,同drop命令一样,也可以通过clientId与addr来指向地址或用户ID进行操作。

5. 数据统计模块

数据统计模块是http模块。因此,统计命令应该位于http模块中。
下面再http server 模块下新增加两个location。
第一个location将流媒体的状态全部记录到stat.xsl中。第二个location将stat.xsl 访问目录指定到/download/NRM中。stat.xsl被包含在NRM的安装目录中,直接只想那里就可以。配置完成后,访问http://192.168.5.13/liveStat,如下所示。可以看到页面中清晰地显示了不同直播下的观众、状态、上/下行速率、时间、地址、系统等信息。

        location /liveStat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }
        location /stat.xsl {
            root /download/NRM/;
        }

在这里插入图片描述
本章主要介绍了HLS在NRM中的使用、推/拉流等术语、control控制器的使用,直播状态的监控,以及一些常用的配置信息等。通过以上内容,我们可以搭建出一个支持HLS协议的直播服务器,并可以通过配置进行个性化设置。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值