基于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的命令来实现不同业务需求。
需要修改的配置文件位于nginx
的http 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