前言
之前使用 nginx-rtmp-module 搭建的直播服务 详见,但rtmp协议需要使用flash,浏览器已经禁用了flash所以是时候该更新技术了。
关于各种直播协议详见这里。
nginx-http-flv-module是基于nginx-rtmp-module 的。它具备了所有nginx-rtmp-module的功能,并且新增多种新功能。
功能 | nginx-http-flv-module | nginx-rtmp-module | 备注 |
---|---|---|---|
HTTP-FLV (播放) | √ | x | 支持 HTTPS-FLV 和 chunked 回复 |
省略 listen 配置 | √ | 配置中必须有一个 listen | -- |
定时打印访问记录 | √ | x | -- |
纯音频支持 | √ | wait_video 或 wait_key 开启后无法工作 | -- |
JSON 风格的 stat | √ | x | -- |
stat 中包含录制详情 | √ | x | -- |
最重要的是nginx-http-flv-module基于 HTTP 协议来传输 FLV 格式的流媒体,这样前端就可以使用flv来播放。
nginx添加 nginx-http-flv-module
下载 nginx-http-flv-module
- 下载 nginx-http-flv-module https://github.com/winshining/nginx-http-flv-module 也可以直接进入nginx-http-flv-module的git页面选择想要的版本
- 上传到服务器后解压
编译nginx-http-flv-module
由于之前已经安装了一些其他的模块,所以先看看nginx当前拥有哪些module,进入nginx安装目录,..nginx/sbin文件夹下执行./ngin -V
[root]# cd /usr/local/nginx/sbin/
[rootsbin]# ./nginx -V
nginx version: nginx/1.20.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k 26 Jan 2017
TLS SNI support enabled
configure arguments: --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.12 --with-openssl=../openssl-1.0.2k --with-http_ssl_module --with-http_mp4_module
- 进行编译时复制上面查到的nginx的module,添加新的module
切换到解压后的nginx目录中执行:(复制上面的命令添加--add-module=../nginx-http-flv-module-master)
./configure --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.12 --with-openssl=../openssl-1.0.2k --with-http_ssl_module --with-http_mp4_module --add-module=../nginx-http-flv-module-master
参数说明:
--prefix 用于指定nginx编译后的安装目录
--add-module 为添加的第三方模块,此次添加了fdfs的nginx模块
--with..._module 表示启用的nginx模块,
- 执行
make
进行编译
如果编译成功的话会在第一步中objs中出现一个nginx文件 ,这里我遇到一个坑,之前安装了 nginx-rtmp-module现在添加nginx-http-flv-module 编译报错了,去掉nginx-rtmp-module就好了
特别注意:在已安装的nginx上进行添加模块的话执行到这里就行了,把objs中的nginx替换掉之前的安装的nginx/sbin/中的nginx文件,如果执行下一步的install,会导致之前安装的nginx被覆盖,比如之前配置好的nginx.conf文件
- 替换原有nginx/sbin下的nginx文件,建议先进行备份,记得先停掉nginx不然文件无法操作
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx
- 执行重启
cd /usr/local/nginx/sbin/
./nginx -s reload
配置nginx.config文件
原有的配置文件中添加 rtmp
#推流配置
rtmp {
log_interval 5s; #log 模块在 access.log 中记录日志的间隔时间,对调试非常有用
log_size 1m; #log 模块用来记录日志的缓冲区大小
server {
listen 1935;
chunk_size 4096;
application live {
live on;
}
application douyin{
live on;
allow publish all;
allow play all; # 允许所有用户播放流
record off;
hls on;
hls_path /usr/local/video/hls;
hls_fragment 10s; #切片时长
hls_playlist_length 60m; #播放列表
hls_continuous on;
hls_cleanup off; # 防止自动清除切片
}
application video{
# 点播视频 播放地址为 rtmp://ip:1935/video/1.mp4
play /home/admin/video;
}
}
}
#播放流
server {
listen 80;
server_name localhost;
location /live {
flv_live on;
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头
}
location /flv {
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias /test;
expires -1;
}
# control控制器
location /control {
rtmp_control all;
}
location /stat {
#推流播放和录制统计数据的配置
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /user/local/nginx/nginx-http-flv-module-master/; #指定 stat.xsl 的位置
}
主要配置为: rtmp标签下的server配置其监听1935端口,并配置了两个application, douyin设置属性live on 表示开启直播,video配置的是点播,在配置的目录下放视频就可以拉流播放。
http标签下的server配置其监听80端口,并配置location /live设置属性 flv_live on。注意其中的 add_header ‘Access-Control-Allow-Origin’ ‘*’ 与 add_header ‘Access-Control-Allow-Credentials’ ‘true’ 很重要,主要解决了前端通过HTTP方式拉流是的跨域问题
配置完之后重启nginx ,
测试推拉流
浏览器打开 http://ip/stat 可以看到统计页面
推流测试
推流使用 OBS Studio软件:输入推流地址,
根据nginx的推流配置的端口和应用名
推流地址示例: rtmp://localhost:1935/douyin/ 流秘钥设置为房间名: test
此时就可以开始推流了。
播放流测试
使用能播放直播流的软件就行potplayer 或者 vlc。 也可以网页播放http://tool.liflag.cn/html5-player/index.html,输入播放流即可。
根据nginx的拉流配置的端口和推流的房间名应用名则可知道 播放流地址为 http://ip/live?port=1935&app=douyin&stream=test
注意:本文归作者所有,未经作者允许,不得转载