文章目录
nginx-http-flv-module的功能
兼容nginx-rtmp-module所有功能
支持HTTP-FLV/HTTPS-FLV方式的直播
支持GOP缓存,以减少首屏时间
支持虚拟主机功能
可以省略listen配置项而不影响基本功能
修复nginx-rtmp-module已知的bug
第一:以动态模块的方式编译安装nginx(基于centos9stream)
#安装必要组件
yum install gcc pcre-devel openssl-devel zlib zlib-devel zip -y
如果NGINX要支持正则表达式,需要PCRE库。
如果NGINX要支持加密访问,需要OpenSSL库。
如果NGINX要支持压缩,需要zlib库。
#下载,解压,重命名nginx和nginx-http-flv-module模块)(这是项目地址:https://github.com/winshining/nginx-http-flv-module)
cd /root ; wget http://nginx.org/download/nginx-1.25.2.tar.gz
tar xf nginx-1.25.2.tar.gz ; mv nginx-1.25.2 nginx
#注意当前版本有一个bug,就是当你在推流时,服务端reload nginx 后进程会"worker process is shutting down"
git clone https://github.com/winshining/nginx-http-flv-module.git
#加载nginx-http-flv-module 模块编译安装nginx
mkdir /app/nginx -p
cd /root/nginx
#nginx-http-flv-module包含了nginx-rtmp-module所有的功能,所以不要将nginx-http-flv-module和nginx-rtmp-module一起编译。
./configure --prefix=/app/nginx --add-dynamic-module=/root/nginx-http-flv-module
#./configure --prefix=/app/nginx --add-dynamic-module=/root/nginx-http-flv-module --with-http-per-worker-listener --with-debug
#--with-http-per-worker-listener 需要先为nginx打上补丁,抱歉能力有限,没打上
make
make install
#删除多余默认的nginx配置文件
rm -f /app/nginx/conf/nginx.conf.default
#把自带的xml格式的统计文件,移动到nginx目录下
cp /root/nginx-http-flv-module/stat.xsl /app/nginx/html/
配置nginx的全局模块,后期需要用到的模块功能。全部以配置文件的形式在全局模块中进行引用
cat /app/nginx/conf/nginx.conf
user nginx;
worker_processes 1;
#在events前面添加http-flv动态模块
load_module /app/nginx/modules/ngx_http_flv_live_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /app/nginx/conf/stat.conf;
include /app/nginx/conf/LL-http.conf;
}
include /app/nginx/conf/TL-rtmp.conf; #注意这配置的是rtmp直播推流,他不在http模块里面,而是放在http模块外面
配置nginx的相关统计界面展示
cat /app/nginx/conf/stat.conf
server {
listen 8081;
location /stat {
#push和pull状态的配置
#rtmp_stat_format json; #默认是格式,这里可以指定为json格式。
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root /app/nginx/html; #指定stat.xsl的位置
}
#如果需要JSON风格的stat, 不用指定stat.xsl
#但是需要指定一个新的配置项rtmp_stat_format
location /control {
rtmp_control all; #rtmp控制模块的配置
}
}
#这是访问地址:http://192.168.60.7:8081/stat
#下面展示的是浏览器访问的效果页面
推流配置:
配置rtmp直播推流模块,并配置录播功能,将流保存为flv的视频文件存在本地(其实也rtmp的拉流也就一起完成了配置)
#创建录播文件存储位置,并将目录的所属组改成nginx(这个很重要,不然数据无法写入)
mkdir -p /video/on-live/flv ; useradd nginx ; chown nginx /video/on-live -R
#下面是rtmp推流设置
cat /app/nginx/conf/TL-rtmp.conf
rtmp_auto_push on; #因为Nginx可能开启多个子进程,这个选项表示推流时,媒体流会发布到多个子进程
rtmp_auto_push_reconnect 1s;
#rtmp_socket_dir /video; #多个子进程情况下,推流时,最开始只有一个子进程在竞争中接收到数据,然后它再relay给其他子进程,他们之间通过 socket传输数据,这个选项表示unix domain socket的路径
rtmp {
out_queue 4096;
out_cork 8;
max_streams 128;
timeout 15s;
drop_idle_publisher 15s;
log_interval 30s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
log_size 1m; #log模块用来记录日志的缓冲区大小
server {
listen 1935;
chunk_size 4096; #流多路复用的最大块大小。默认值为4096。此值越大,CPU开销越低。该值不能小于128。
application on-live {
live on; #开启直播直播模式,一对多广播
hls on;
gop_cache on; #开启解决首屏响应问题,加快响应
wait_key on; #对视频切片进行保护,开启后发现分片保存的数量多了,功能是使视频流重一个关键帧开始,默认为off
hls_path /video/on-live/hls; #hls切片视频文件存放位置,若是配置hls拉流的形式,拉流配置里面要写清楚这个路径
hls_fragment 5s; #默认是5秒。只能为整数,#每个视频切片的时长
hls_playlist_length 60s; ##总共可以回看的事件,这里设置的是1分钟
hls_continuous on; #连续模式
hls_cleanup on; #对多余的切片进行删除
#publish_notify on; #推流验证,和下一行需一起使用
#on_publish http://localhost/auth.php; #推流验证,具体可参照后文
#下面是录播配置
record all; #启用录制所有信息,包括视频和声音(有其他可选项,参考文档)
record_path /video/on-live/flv; #flv录制文件存放地址。注意该目录的所有者要是nginx,或者777权限
record_max_size 300M; #控制文件的大小,每个文件到了300m后,结合下面的参数新创建一个文件继续保存
record_unique on; #在文件名后加上unlix时间戳,防止重复写同一文件造成视频丢失(默认是关闭的)
}
}
}
#当我们这样配置后,我们的推流地址将会是:rtmp://192.168.60.7/on-live/
#当我们确定要推流时,流名字设置为(王者荣耀)wzry时,我们的推流地址是:rtmp://192.168.60.7/on-live/wzry
#同时,我们的rtmp播放地址将是:rtmp://192.168.60.7/on-live/wzry
拉流配置:配置http-flv方式 以及 hls方式 播放直播流
cat /app/nginx/conf/LL-http.conf
#http-flv方式
server {
listen 80;
location /live {
flv_live on; #打开HTTP播放FLV直播流功能
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
#hls方式
server {
listen 8080;
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
#或者这样写 application/x-mpegURL
video/mp2t ts;
}
alias /video/on-live/hls/; #直播hls分片的路径,一定要写哦,很重要
chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
==============分割线=============
#http-flv的播放方式及地址:(vlc)
#拉流url为 http://ip:port/[http拉流app名字]?port=[rtmp推流端口]&app=[rtmp推流app名字]&stream=[视频流名称]
http://192.168.60.7/live?port=1935&app=on-live&stream=wzry
如果要实现 HTML5 对http-flv的形式播放,可以使用 B 站开源的 flv.js,更多内容可以参照其文档,此处不做更多说明。
#hls的播放方式及地址
第一:先在nginx中的web目录创建播放页面文件,并且把hls的路径写进去(注意内容里src的写法)
cat /app/nginx/html/index.html
<!--index.html-->
<html>
<body>
<video autoplay webkit-playsinline controls>
<source src="http://192.168.60.7:8080/hls/wzry.m3u8" type="application/vnd.apple.mpegurl" />
<p class="warning">Your browser does not support HTML5 video.</p>
</video>
</body>
</html>
第二:如何播放,直接用浏览器打开网址就可以 http://192.168.60.7/index.html
下面附图是主流浏览器对HLS的支持情况(移动端安卓和IOS的浏览器基本都支持的,window PC端支持力度不够,)
如果浏览器并不原生支持 hls,可使用第三方插件,例如 hls.js;或者使用 video.js 配合 videojs-contrib-hls,这也是不错的解决方案
配置点播:http & rtmp点播的配置与播放方式
#先确定视频文件的路径(把视频文件放到/video/vod/ 这个目录下即可)
[root@rtmp-http-mp4-flv video]# ls /video/vod/ -l
total 17052
-rw-r--r-- 1 root root 17458996 Mar 26 2019 1.mp4
#配置http的点播,直接在浏览器里面输入url路径即可播放(注意:这是在http模块中配置的)
server {
listen 8080;
location /dianbo {
alias /video/vod;
limit_rate_after 50m; #---------下载10m后再限速
limit_rate 5000k; #----------限速500k
}
}
#配置rtmp的点播,rtmp方式的点播很不友好建议不开,不能快进,快进就卡死(注意:这是在rtmp模块下配置的)
#server {
# listen 1935;
# chunk_size 4096;
# application dianbo {
# play /video/vod;
# }
#}
#http方式的点播放方式及地址(浏览器直接打开)
"http://192.168.60.7:8080/dianbo/1.mp4"
#rtmp方式的点播播放方式及地址(用vlc吧)
# "rtmp://192.168.60.7/dianbo/1.mp4"
配置:流中继,转播(由于rtmp的实时性,低延迟,这里只做了rtmp的转播配置)
注意:至少要有一个客户端连接,才会去拉取源流,我测试中,本地不会保存任何数据
rtmp {
server {
listen 1935;
chunk_size 4096;
application bkb-onlive {
live on;
gop_cache on; #开启解决首屏响应问题,加快响应
hls on;
pull rtmp://media3.scctv.net/live/scctv_800; #这是配置rtmp直播转播
#play /var/local_mirror http://myserver.com/vod; #点播转播
hls_path /video/bkb-onlive/hls;
#下面还可以开启边转播边录制
#record all;
#record_path /video/bkb-onlive/flv;
#record_max_size 100M;
#record_unique on;
}
}
}
#rtmp方式播放地址(注意最后面的流名字)
rtmp://192.168.60.7/bkb-onlive/scctv_800
#http-flv方式播放地址:(http-flv的拉流配置沿用:第四步:配置http-flv方式 以及 hls方式 播放直播流)
http://192.168.60.7/live?port=1935&app=bkb-onlive&stream=scctv_800
配置收流服务器:中转推流服务器,将client的直播流 推到 中转服务器,中转服务器再推送到各大网站上,并开启直播验证(类似输入房间号),待完善
#收流与转推配置
rtmp { #RTMP服务
server{
listen 1935; #服务端口
chunk_size 10240; #数据传输块的大小
application live {
live on;
record off;
on_publish http://YOUR_SERVERNAME:2080/auth;
push rtmp://live.twitch.tv/app/YOUR_LIVE_API; #RTMP直播地址1
push rtmp://a.rtmp.youtube.com/YOUR_LIVE_API; #RTMP直播地址2
}
}
}
#收流验证配置(类似房间号+密码)
http {
server {
listen 127.0.0.1:2080;
location /auth {
rewrite_by_lua '
ngx.req.read_body()
local name = ngx.req.get_post_args().name
if (name == "xxxxxxxxxx") then
ngx.status = 200
ngx.say("OK")
ngx.exit(200)
else
ngx.status = 403
ngx.say("Forbidden")
ngx.exit(403)
end
';
}
}
}
#测试 RTMP 服务器配置
curl -0 http://127.0.0.1:2080/auth -d "name=xxxYOUR_UUID"
#xxxYOUR_UUID 替换成前面生成的 UUID,应该输出 OK,再把 xxxYOUR_UUID 换成一个错误的,应该输出 Forbidden。
增加rtmp推送校验
正常的直播系统都是需要使用rtmp传送房间号和校验码,所以看上个代码里有一个on_pulish配置。我们需要做个代理进行key校验。
把这个key校验放到8080端口 进行判断。正常情况应该是把这个on_publish请求转发到 python、java、nodejs等后台服务读取数据库进行校验。
这里由于是搭建个人使用环境,就进行简单配置就行了。
http {
server {
listen 8080;
...
location /on_publish {
default_type text/html;
if ($arg_key != 123456) {
return 404;
}
return 200;
}
...
}
}
第二:为web播放MP4创建播放器
rm /app/nginx/html/index.html -rf
cd /app/nginx/html/
wget https://qiniu.wsfnk.com/index-play.html
mv index-play.html index.html
第四:各种客户端,推流,拉流地址(注意这样的直播推流,差不多存在两分钟的延迟)
http://13.16.37.9/hls/home.m3u8
rtmp://13.16.37.9/dianbo/1.mp4 #vlc客户端拉流地址
http://13.16.37.9:8081/2.mp4 #网页播放/vlc都可以,用http协议可以快进
#下图是推流地址
延迟对比
rtmp:在没开启gop_cache on; 首屏满的要死,开启后首屏秒开,整体延迟在5s左右
附nginx配置文件讲解及 公共的RTMP源
#公共源
1,RTMP协议直播源
美 国 台:rtmp://media3.scctv.net/live/scctv_800
淮北影视频道:rtmp://vod.0561rtv.com:1935/live/live4
2,RTSP协议直播源
3,HTTP协议直播源
CCTV1高清:http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8
CCTV3高清:http://ivi.bupt.edu.cn/hls/cctv3hd.m3u8
CCTV5高清:http://ivi.bupt.edu.cn/hls/cctv5hd.m3u8
CCTV5+高清:http://ivi.bupt.edu.cn/hls/cctv5phd.m3u8
CCTV6高清:http://ivi.bupt.edu.cn/hls/cctv6hd.m3u8
苹果提供的测试源:http://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear2/prog_index.m3u8
ffmpeg的安装
sudo apt-add-repository ppa:jon-severinsson/ffmpeg
sudo apt-get update
sudo apt-get install ffmpeg
附参考文章
基于 Nginx 搭建视频直播服务器
关于HLS直播流HTML页面播放解决
PC浏览器播放HLS协议的视频
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论