赞
踩
前面几张主要讲解了nginx、nginx-rtmp-module、ffmpeg的环境搭建以及我们成功搭建了第一个直播系统。这一章主要介绍如何配置一个基于HLS协议的直播系统,以及m3u8与ts文件的配置,然后逐渐深入介绍NRM与直播系统的高级应用。
[root@localhost ~]# mkdir /usr/local/m3u8File
[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; } } }
执行推流命令,这里额外配置了视频编码器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文件播放流媒体了。
在直播技术中,经常会涉及推流(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
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;
}
通过record命令,可以实现录制与停止直播流功能。
下面先来一个最简单的实现录制直播流的配置示例。
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即可。
(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;
在配置了 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
可以通过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进行操作。
数据统计模块是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协议的直播服务器,并可以通过配置进行个性化设置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。