Windows2012搭建Nginx-Trmp推拉流并将推流保存在服务器上供用户点播详解<亲测可行方案>
- 一、 Nginx服务器的搭建
-
- 1.1、国内大神编译windows版Nginx下载:
- 1.2 国外大神所编译Windows版下载
- 二、Windows-Nginx安装
- 三、启动Nginx-Rtmp服务
-
- 3.1 启动nginx方法一
- 3.2启动nginx方法二(使用Nginx命令启动)
- 3.3查看nginx是否启动
- 3.4 停止nginx服务
- 四、nginx 服务conf配置
-
- 4.1 开启RTMP服务的配置
- 4.2、开启写入权限
- 五、推流到服务器
-
- 5.1 推流方法一(选用OBS STUDIO软件)
-
- 5.1.1 OBS设置
- 5.2 推流方法二(选用ffmpeg软件)
- 六、 服务器端HlS设置
-
- 6.1服务器端的设置
- 6.2 推流端设置
- 6.3跨域代码
- 6.4 VLC中的设置
- 6.5服务器端文件夹的设置
- 6.6 客户端VLC演示效果
- 七、服务器端CONF配置文件设置所有代码
- 九、点播配置
一、 Nginx服务器的搭建
笔者在搭建Windows-Nginx系统走了不少的弯路参考了大约上百篇文章的介绍搞得笔者一头的雾水可以说是到处是坑为了让网友不象我一样记录此文,希望能帮到你。看完此文无需在看其它文章。
下面是百度对Nginx系统的说明抄录于下:
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
1.1、国内大神编译windows版Nginx下载:
目前有国内大神编译有windows版本带有trmp模块的供下载:
博客地址:博客地址
windows版下载地址:windows版下载地址
下面是下载界面如下图(一):
下载解压后如图(二)所示:
点README.md可以看到 Nginx: 版本是1.14.1 Nginx-Rtmp-Module: 1.2.1如下图(三)所示:
1.2 国外大神所编译Windows版下载
国内博客介绍:国内博客对国外大神对WIN版介绍
国外下载地址:国外Win版下载地址
如图(四)所示:
如图(五)所示:
这个网站同时也提供了vcredist的下载(x86,x64),以避免运行nginx时出现缺少库的错误。
二、Windows-Nginx安装
笔者所用WIN版Nginx是国内大神编译系统就用国内版本做出说明。下载解压后安装包复制到C:盘根目录下所图(六)所示:
三、启动Nginx-Rtmp服务
3.1 启动nginx方法一
如图(七)所示双击nginx.exe或使用nginx命令图(九)所示
3.2启动nginx方法二(使用Nginx命令启动)
打开CMD窗口进入根目录命令 CD
进入nginx-rtmp-win32-dev文件夹命令:cd nginx-rtmp-win32-dev
启动nginx命令 nginx.exe -c conf/nginx.conf 回车。这个命令是把配置文件一起读取
3.3查看nginx是否启动
键盘按下WIN+R 键 输入powershell命令如图(十)所示:
在powershell 输入 netstat -an 命令查看1395端口是否开启 如图(十一)所示:
1395端口如果显示说明nginx服务已经开启如图(十二)所示:
3.4 停止nginx服务
按键盘win+r盘 输入CMD 回车如图(十三)所示:
进入nginx-rtmp-win32-dev文件夹命令:cd nginx-rtmp-win32-dev
输入nginx.exe -s stop 命令回车 如图(十四)所示:
如果1395端口没有说明nginx服务停止如图(十五)所示:
四、nginx 服务conf配置
4.1 开启RTMP服务的配置
下面展示一些
rtmp代码
。
rtmp {
server {
listen 1935;
chunk_size 4000;
application live {
live on;
#为rtmp引擎设置最大连接数,默认off
max_connections 1024;
recorder rec1{
#record all manual; # 不自动启动录制,使用控制接口来启动/停止添加上manual 组合标识,下发录制指令start后才开始录制
record all; #表示推流的时候就开始录制
record_unique on; # 是否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为 off。
record_path d:/video; # 保存路径:注意目录权限,确保有写入的权限
record_suffix -%Y-%m-%d-%H_%M_%S.flv; # 设置录制文件后缀名,可以匹配 strftime 格式
record_max_size 5M; # 设置录制文件的最大值。
}
}
4.2、开启写入权限
如果推流没有保存到d:/video内设置一下文件夹属性右击属性->安全->高级->添加->选择主主->高级->立即查找->选择Guest如图(十六)所示
选择修改、读取和执行、读取、写入。仅将这些权限应用到此窗口中的对象和/容器勾选。如图(十七)所示
五、推流到服务器
5.1 推流方法一(选用OBS STUDIO软件)
OBS作为一款完全免费的直播软件,是一款非常实用经典的录制软件,专门用来录制直播用的,绝大多数的的主播门都喜欢用这款软件,也足够说明它的强大之处了,不管你是用来直播内容,使用它都可以做到得心应手。软件界面如图(十八)所示
5.1.1 OBS设置
点击设置如图(十九)所示
我的服务器地址是192.168.1.30 RTMP推流端口是1935(nginx-rtmp默认端口)live 是RTMP设置项与Nginx 配置中application live{live on}对应串流密钥test 在推流时将生成一个test文件大小为5M文件如图(二十)所示
5.2 推流方法二(选用ffmpeg软件)
按win+r键 调出运行窗口输入cmd 回车打开cmd窗口,输入ffmpeg回车如图(二十一)所示
输入ffmpeg -re -i “f:/黑客帝国2:重装上阵.mp4” -f flv “rtmp://192.168.1.30/live/test” 如图(二十二)所示
ffmpeg的下载安装方法可以参考其它文献。ffmpeg的设置不在本章讨论范围内,有一点需要注意的是下载后的ffmpeg需要设置一下环境变量如果不设置要执行ffmpeg 就要到ffmpeg文件夹下执行ffmpeg命令。
六、 服务器端HlS设置
6.1服务器端的设置
下面展示一些
服务器端hls的设置片断
。
rtmp {
server {
listen 1935;
chunk_size 4000;
# video on demand
application live {
live on;
#为rtmp引擎设置最大连接数,默认off
max_connections 1024;
recorder rec1{
#record all manual; # 不自动启动录制,使用控制接口来启动/停止添加上manual 组合标识,下发录制指令start后才开始录制
record all; #表示推流的时候就开始录制
record_unique on; # 是否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为 off。
record_path d:/video; # 保存路径:注意目录权限,确保有写入的权限
record_suffix -%Y-%m-%d-%H_%M_%S.flv; # 设置录制文件后缀名,可以匹配 strftime 格式
record_max_size 5M; # 设置录制文件的最大值。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
application hls {
live on; #启用rtmp直播
hls on; #启用hls直播
hls_path d:/tmp/hls; #录制保存地址这里用了绝对路径
hls_fragment 3s; #切片时间为3秒
hls_sync 100ms; #音视频同步时间
hls_cleanup on; #是否删除列表中已经没有的媒体块
hls_playlist_length 120s; #m3u8和ts在hls文件夹下的保存时间
recorder rec { #启用录制
# record all manual; #手动控制录制启停
record all; #表示推流的时候就开始录制
#record_suffix _rec.flv;
record_path d:/tmp/hls; #录制保存地址
#record_unique on; # 是否添加时间戳到录制文件。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
注意:hls因为使用http协议,所以请在配置中允许跨域,否则无法拉流。
6.2 推流端设置
这时如果路径下有.m3u8文件就能拉流了,举例如果上面路径中有一个A109.m3u8的文件,在VLC中输入http://192.168.1.30:8080/hls/A109.m3u8就可以拉流了。推流我们还是用OBS软件这个软件使用方便这次串流密钥我们设置为A109,推流地址是HLS如图(二十三)所示:
6.3跨域代码
下面展示一些
跨域代码片断
。
http {
server {
listen 8080;
location / {
root html;
#index index.html index.htm;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
#location /live { #这里也是需要添加的字段。
#types {
#application/vnd.apple.mpegurl m3u8;
#video/mp2t ts;
#}
#alias d:/video;
#expires -1;
#add_header Cache-Control no-cache;
#add_header Access-Control-Allow-Origin *;
#add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
#add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
#}
#服务器状态
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
location /control {
rtmp_control all;
}
#hls直播地址
location /hls {
#server hls fragments
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias d:/tmp/hls; #录制保存地址; #看这里用了绝对路径
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
下面是跨域代码
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
6.4 VLC中的设置
如图(二十四所示)我的服务HTTP端口是8080所以这里要把端口输入进去。如果端口为80可以不用填写
6.5服务器端文件夹的设置
服务器端的文件夹我设置在D盘下有一个tmp文件在tmp下有一个hls文件夹。这个文件夹要注意权限的设置添加来宾Guests设置为能写入即可。关于Guests的设置上文已介绍过这里不在详述。如图(二十五)所示
文件夹设置好后推流就可以写数据到服务器文件夹中下图(二十六)看到有了m3u8文件
6.6 客户端VLC演示效果
如图(二十七)所示为hls播放效果
七、服务器端CONF配置文件设置所有代码
下面展示所有
配置文件
。
#user Guests;
worker_processes 1;
error_log logs/error.log info;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4000;
# video on demand
application vod {
play d:/tmp/hls; #点播地址这里与推流地址一样1
}
application vod2 {
play d:/tmp/hls2; #点播地址这里与推流地址一样2
}
application vod3 {
play d:/tmp/hls3; #点播地址这里与推流地址一样3
}
application vod4 {
play d:/tmp/hls4; #点播地址这里与推流地址一样4
}
application live {
live on;
#为rtmp引擎设置最大连接数,默认off
max_connections 1024;
recorder rec1{
#record all manual; # 不自动启动录制,使用控制接口来启动/停止添加上manual 组合标识,下发录制指令start后才开始录制
record all; #表示推流的时候就开始录制
record_unique on; # 是否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为 off。
record_path d:/video; # 保存路径:注意目录权限,确保有写入的权限
record_suffix -%Y-%m-%d-%H_%M_%S.flv; # 设置录制文件后缀名,可以匹配 strftime 格式
record_max_size 5M; # 设置录制文件的最大值。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
application hls {
live on; #启用rtmp直播
hls on; #启用hls直播
hls_path d:/tmp/hls; #录制保存地址这里用了绝对路径
hls_fragment 3s; #切片时间为10秒
hls_sync 100ms; #音视频同步时间
hls_cleanup on; #是否删除列表中已经没有的媒体块
hls_playlist_length 120s; #m3u8和ts在hls文件夹下的保存时间
recorder rec { #启用录制
# record all manual; #手动控制录制启停
record all; #表示推流的时候就开始录制
#record_suffix _rec.flv;
record_path d:/tmp/hls; #录制保存地址
#record_unique on; # 是否添加时间戳到录制文件。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
application hls2 {
live on; #启用rtmp直播
hls on; #启用hls直播
hls_path d:/tmp/hls2; #录制保存地址这里用了绝对路径
hls_fragment 3s; #切片时间为10秒
hls_sync 100ms; #音视频同步时间
hls_cleanup on; #是否删除列表中已经没有的媒体块
hls_playlist_length 120s; #m3u8和ts在hls文件夹下的保存时间
recorder rec2 { #启用录制
# record all manual; #手动控制录制启停
record all; #表示推流的时候就开始录制
#record_suffix _rec.flv;
record_path d:/tmp/hls2; #录制保存地址
#record_unique on; # 是否添加时间戳到录制文件。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
application hls3 {
live on;
hls on;
hls_path d:/tmp/hls3;
hls_fragment 3s; #切片时间为10秒
hls_sync 100ms; #音视频同步时间
hls_cleanup on; #是否删除列表中已经没有的媒体块
hls_playlist_length 120s; #m3u8和ts在hls文件夹下的保存时间
recorder rec3 { #启用录制
# record all manual; #手动控制录制启停
record all; #表示推流的时候就开始录制
#record_suffix _rec.flv;
record_path d:/tmp/hls3; #录制保存地址
#record_unique on; # 是否添加时间戳到录制文件。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
}
}
application hls4 {
live on;
hls on;
hls_path d:/tmp/hls4;
hls_fragment 3s; #切片时间为10秒
hls_sync 100ms; #音视频同步时间
hls_cleanup on; #是否删除列表中已经没有的媒体块
hls_playlist_length 120s; #m3u8和ts在hls文件夹下的保存时间
recorder rec { #启用录制
# record all manual; #手动控制录制启停
record all; #表示推流的时候就开始录制
#record_suffix _rec.flv;
record_path d:/tmp/hls4; #录制保存地址
#record_unique on; # 是否添加时间戳到录制文件。
#exec_record_done 'c:/nginx-rtmp-win32-dev/ffmpeg/bin/ffmpeg' -y -i d:/video/test/livestream.flv -vcodec libx264 -f mp4 d:/video/test/test_record.mp4 2>>d:/video/test/test_record.log;
#exec_record_done bash -c "ffmpeg -i $path -y -vcodec copy -acodec copy $dirname/$basename.mp4;rm -rf $path";
}
}
}
}
http {
server {
listen 8080;
location / {
root html;
#index index.html index.htm;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
#location /live { #这里也是需要添加的字段。
#types {
#application/vnd.apple.mpegurl m3u8;
#video/mp2t ts;
#}
#alias d:/video;
#expires -1;
#add_header Cache-Control no-cache;
#add_header Access-Control-Allow-Origin *;
#add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
#add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
#}
#服务器状态
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl {
root html;
}
location /control {
rtmp_control all;
}
#hls直播地址
location /hls {
#server hls fragments
types{
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias d:/tmp/hls; #录制保存地址; #看这里用了绝对路径
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
location /hls2 {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias d:/tmp/hls2;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
location /hls3 {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias d:/tmp/hls3;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
location /hls4 {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
alias d:/tmp/hls4;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
}
}
九、点播配置
下面展示一些
点播片断
。
# video on demand
application vod {
play d:/tmp/hls; #点播地址这里与推流地址一样1
}
笔者定义了四个文件夹分别是hls、hls2、hls3、hls4目的是客户端推流文件放入不同的文件夹中以便管理。在推流的时候只要把推流地址分别对应这四个文件夹就可以。第一个客户可以是向服务器推流rtmp://192.168.1.30:1935/hls;第二个客户向服务器推流rtmp://192.168.1.30:1935/hls2;第三个客户rtmp://192.168.1.30:1935/hls3;第四个客户rtmp://192.168.1.30:1935/hls4/串流密钥可以自己定义
点播服务是客户端推流结束后服务器端会把推流的文件保存下来以供点播回看。只需要用浏览器或VLC播放器观看就可以如图(二十八)所示:
需要注意的是点事地址为rtmp://192.168.1.30:1935/vod/A109,这里不在是hls方法而是vod方法点播需要与你在服务器端配置的方法相一至
application vod {
play d:/tmp/hls;
}
application vod是服务器端配置的点播地址
如图(二十九)所示是点播演示效果
七、服务器端CONF配置文件设置所有代码是笔者在服务器端配置代码《复制》这段代码就可以在windows系统上正常运行。亲测可行方案。笔者服务器所用是windows2012操作系统。