【官⽅⽂档】Nginx模块Nginx-Rtmp-Module学习笔记(⼀)RTMP命令详解
说明:
rtmp的延迟主要取决于播放器设置,但流式传输软件,流的⽐特率和⽹络速度(以及响应时间“ping”)可能会对延迟产⽣影响,具有播放器的本地rtmp服务器使⽤“否”缓冲区(如0.1-0.2秒缓冲区等)可能会在0.8-1.2秒之间总是延迟,当事情正好⼯作时
nginx配置⽂件
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
exec ffmpeg -i rtmp://localhost/live/$name -threads 1 -c:v libx264 -profile:v baseline -b:v 350K -s 640x360 -f flv -c:a aac -ac 1 -strict -2 -b:a 56k rtmp://localhost/live360p/$name;
}
application live360p {
live on;
record off;
allow publish 127.0.0.1;
allow publish 0.0.0.0;
deny publish all;
}
}
}
以上为vlc播放测试结果:分别为720 和 360
命令详解
RTMP
语法:rtmp {...}
上下⽂:root
保存所有RTMP设置的块
server
语法:server {...}
上下⽂:rtmp
声明RTMP服务器实例
rtmp {
server {
}
}
listen
语法:listen(addr [:port] | port | unix:path)[bind] [ipv6only = on | off] [so_keepalive = on | off | keepidle:keepintvl:keepcnt | proxy_protocol]
上下⽂:服务器
将监听套接字添加到NGINX以接受RTMP连接
server {
listen 1935;
}
application
语法:应⽤程序名称{...}
上下⽂:服务器
创建RTMP应⽤程序。不像http位置应⽤程序名称不能是⼀个模式(正则?)。
server {
listen 1935;
application myapp {
}
}
timeout
语法:超时值
上下⽂:rtmp,服务器
套接字超时。这个值主要⽤于写作。⼤多数情况下,RTMP模块不会期望除发布者套接字以外的所有套接字上的任何活动。如果你想断开套接字快速断开连接,可以使⽤keepalive或RTMP ping等有效⼯具。默认值是1分钟。
timeout 60s;
ping
语法:ping 值
上下⽂:rtmp,服务器
RTMP ping时间间隔。零点关闭。 RTMP ping是⽤于活动连接检查的协议功能。⼀个特殊的数据包被发送到远程对等体,并且在⼀个由ping_timeout指令指定的超时期限内得到应答。如果在这段时间内没有收到ping应答,则连接关闭。 ping的默认值是1分钟。默认的ping超时时间是30秒。
ping 3m;
ping_timeout 30s;
chunk_size
语法:chunk_size value
上下⽂:rtmp,服务器
流复⽤的最⼤块⼤⼩。默认值是4096.这个值越⼤,CPU开销就越低。这个值不能⼩于128。
max_queue
max_message
语法:max_queue value
上下⽂:rtmp,服务器
输⼊数据信息的最⼤尺⼨。所有的输⼊数据都被拆分成消息(还有块)。部分消息在等待完成时保存在内存中。理论上来说,传⼊的消息可能⾮常⼤,这可能是服务器稳定性的⼀个问题。在许多情况下,默认值1M就⾜够了。
on_publish
语法:on_publish url
上下⽂:rtmp, server, application
描述:这个可以设置为⼀个API接⼝(GET⽅式接受所有参数),会给这个API接⼝返回8个参数:
注意:nginx-rtmp-module-1.1.11 中的on_publish 回调的请求为post请求⽅式:
$app = $_GET['app'];
$swfurl = $_GET['swfurl'];
$tcurl = $_GET['tcurl'];
$pageurl = $_GET['pageurl'];
$addr = $_GET['addr'];
$clientid = $_GET['clientid'];
$call = $_GET['call'];
$name = $_GET['name'];
on_publish_done
语法:on_publish_done url
上下⽂:rtmp, server, application
描述:等同于 on_done 的表现,但只适⽤于发布结束事件。
$app = $_GET['app'];
$swfurl = $_GET['swfurl'];
$tcurl = $_GET['tcurl'];
$pageurl = $_GET['pageurl'];
$addr = $_GET['addr'];
$clientid = $_GET['clientid'];
$call = $_GET['call'];
$name = $_GET['name'];
on_publish_done和on_publish的不同的区别就是on_publish(call=publish),⽽on_publish_done(call=publish_done)
实际案例:
notify_method get;
application live {
live on;
on_publish mworker.baidu/Notify/Notify;
}
注意要点:要使⽤on_publish和on_publish_done 必须的添加 notify_method get; 否则的话OBS推流总是推不上去的,服务器不认哦
on_connect
语法:on_connect url
上下⽂:rtmp, server
设置HTTP连接的回调。当客户端连接问题的命令HTTP请求是异步发出命令和处理被挂起,直到它返回结果代码。如果返回HTTP 2XX代码,然后RTMP会话继续。3XX的代码使RTMP重定向到另⼀个应
⽤程序,其名称取⾃LocationHTTP响应头。否则,连接被丢弃。
注意:这个指令不应⽤范围允许的,因为应⽤还处于连接阶段不明。
HTTP请求接收多个参数。POST⽅法⽤于应⽤程序/ x-WWW的形式了urlencoded MIME类型。下⾯的参数被传递给调⽤者:
调⽤=连接
flash swf播放器地址 - 客户端IP地址
应⽤ - 应⽤名称
flashVer - 客户端flash版本
swfUrl - 客户端SWF⽹址
tcUrl - tcUrl
PAGEURL - 客户端页⾯⽹址
如何使⽤,官⽅都说了要加载
除了上述项⽬明确地传递给connect命令的所有参数也与回调发送。您应当区分连接参数从播放/发布参数。玩家通常具有播放/流发布名设置连接字符串分开的⼀种特殊⽅式。作为⼀个例⼦下⾯是这些参数是如何在JWPlayer设置
object(stdClass)[7]
public 'app' => string 'live' (length=4)
public 'flashver' => string 'WIN 24,0,0,186' (length=14)
public 'swfurl' => string 'sewise.amai8/lib/jwplayer/jwplayer.flash.swf' (length=55) //客户端播放器地址
public 'tcurl' => string 'rtmp://121.26.206.11/live/' (length=27) //直播流播放器地址
public 'pageurl' => string 'sewise.amai8/player/jw_player' (length=40)
public 'addr' => string '218.108.35.150' (length=14) //客户端播放地址
public 'epoch' => string '982956199' (length=9) //这个每次都会去变得,VLC、⼿机、浏览器、播放器
public 'call' => string 'connect' (length=7)
断开OBS推送流到服务器(当然了客户端也会同时断掉的)
curl 150.261.11.180/control/drop/publisher?app=live&name=4001482742932
断开当前客户端播放的链接,但是不会断开OBS的推流系统
curl 150.26.11.180/control/drop/client?app=live&name=4001482742932&addr=115.192.190.59&clientid=95
curl 150.26.11.180/control/drop/client?app=live&name=4001482742932&clientid=116
实践操作记录:200 OBS可以推流。500 OBS 推流不可以
header($this->https(500)); // PHP 服务端设置Http状态码的回调
功能:
【1】实现推流权限的控制
【2】推流⿊⽩名单
on_update
语法:on_update url
context:rtmp,server,application
设置更新回调。这个回调⽤周期调⽤ notify_update_timeout。如果⼀个请求返回HTTP结果,⽽不是2xx连接被终⽌。这可以⽤于同步已过期的会话。两个额外的参数time,并timestamp 传递给这个处理程序:
time 是播放/发布呼叫的秒数
timestamp 是发送到客户端的最后⼀个⾳频/视频数据包的RTMP时间戳
您可以使⽤timestamp参数单独限制每个⽤户的播放持续时间。
on_update example/update;
推流地址:rtmp://192.168.18.143/live/880?wsSecret=e2112a78822bf4ea9cdb3989e114344c&wsTime=1479196093
回调返回的所有参数:
'app' => string 'live' (length=4)
'flashver' => string 'LNX 9,0,124,2' (length=13)
'swfurl' => string '' (length=0)
'tcurl' => string 'rtmp://192.168.18.143:1935/live' (length=31)
'pageurl' => string '' (length=0)
'addr' => string '192.168.18.73' (length=13)
'clientid' => string '3321' (length=4)
'call' => string 'update_play' (length=11)
'time' => string '728' (length=3)
'timestamp' => string '716600' (length=6)
'name' => string '880' (length=3)
'wsSecret' => string 'e2112a78822bf4ea9cdb3989e114344c' (length=32)
'wsTime' => string '1479196093' (length=10)
播放客户端IP地址:192.168.18.73
on_record_done
语法:on_record_done url
背景:RTMP,服务器,应⽤程序,记录
设置record_done回调。除了常见的HTTP回调变量它接收到以下值
记录 - 在配置或空字符串内联录⾳机录像机名
路径 - 录制的⽂件路径
on_record_done example/recorded;
该URL地址⼀GET⽅式获取所有的参数如下:
'app' => string 'live' (length=4)
'flashver' => string 'FMLE/3.0 (compatible; FMSc/1.0)' (length=31)
'swfurl' => string 'rtmp://192.168.18.143/live' (length=26)
'tcurl' => string 'rtmp://192.168.18.143/live' (length=26)
'pageurl' => string '' (length=0)
'addr' => string '192.168.18.73' (length=13)
'clientid' => string '334' (length=3)
'call' => string 'record_done' (length=11)
'recorder' => string '' (length=0)
'name' => string 'test123' (length=7)
'path' => string '/home/tinywan/video_recordings/test123-1491375411.flv' (length=53)
再次录像停⽌返回结果不同点
'path' => string '/home/tinywan/video_recordings/test123-1491375411.flv' (length=53)
RTMP直接录制成mp4格式:
application live {
allow play all;
live on;
record all;
record_path /tmp/flv;
record_unique on;
exec_record_done ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 /home/tinywan/video_recordings/$basename.mp4;
}
record_suffix
语法:record_suffix value
context:rtmp,server,application,recorder
设置记录⽂件后缀。默认为“.flv”。
record_suffix _recorded.flv;
记录后缀可以是strftime格式的格式。以下指令
record_suffix %Y%m%d%H%M%S.flv;
⽣成的flv的格式为:123-149144221220170406093012.flv ,123代表推流名称
record_unique
语法:record_unique on|off
context:rtmp,server,application,recorder
如果打开,将当前时间戳附加到录制⽂件。否则,每次新录制发⽣时,重写相同的⽂件。默认关闭。
record_unique on;
开启后的案例: 123-1491386267.flv
没有开启的案例: 123.flv
添加这个参数:
record_suffix %Y%m%d%H%M%S.flv;
⽣成的录制⽂件为:12320170406094409.flv (123 为推流名称)
经验分享:
record_suffix %Y%m%d%H%M%S.flv;
record_unique on;
把以上两个同时开启,录制⽂件为:123-149144326920170406094749.flv 这样⽅便以后录制⽂件的处理
record_append
语法:record_append on|off
context:rtmp,server,application,recorder
切换⽂件追加模式。打开录像机后,将新数据附加到旧⽂件,或者在缺少时创建它。旧数据与⽂件中的新数据之间没有时间差距。默认关闭。
record_append on;
record_lock
语法:record_lock on|off
context:rtmp,server,application,recorder
当打开当前录制的⽂件被锁定fcntl。可以从别处检查,以查明正在记录哪个⽂件。默认关闭。
record_lock on;
在FreeBSD上,您可以使⽤flock⼯具来检查。在Linux flock上fcntl是⽆关紧要的,所以你要写⼀个简单的脚本检查⽂件锁定状态。这是⼀个这样的脚本的例⼦isunlocked.py。
#!/usr/bin/python
import fcntl, sys
sys.stderr.close()
fcntl.lockf(open(sys.argv[1], "a"), fcntl.LOCK_EX|fcntl.LOCK_NB)
record_max_size
语法:record_max_size size
context:rtmp,server,application,recorder
设置最⼤记录⽂件⼤⼩。
record_max_size 128K;
record_max_frames
语法:record_max_frames nframes
context:rtmp,server,application,recorder
设置每个录制⽂件的最⼤视频帧数。
record_max_frames 2;
record_interval
语法:record_interval time
context:rtmp,server,application,recorder
重新启动录⾳后这个数(毫秒)秒。默认关闭。零表⽰录⾳之间没有延迟。如果record_unique关闭,则所有记录⽚段都将写⼊同⼀个⽂件。否则附加时间戳,使⽂件不同(给定record_interval超过1秒)。
record_interval 1s;
record_interval 15m;
timeout
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论