NginxRTMP模块nginx-rtmp-module指令详解
译序:截⾄ Jul 8th,2013 官⽅公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解。
指令
Core
rtmp
语法:rtmp { ... }
上下⽂:根
描述:保存所有 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]
上下⽂:server
描述:给 NGINX 添加⼀个监听端⼝以接收 RTMP 连接。
server {
listen 1935;
}
application
语法:application name { ... }
上下⽂:server
描述:创建⼀个 RTMP 应⽤。application 名的模式并不类似于 http location。
server {
listen 1935;
application myapp {
}
}
timeout
语法:timeout value
上下⽂:rtmp, server
描述:Socket 超时。这个值主要⽤于写数据时。⼤多数情况下,RTMP 模块并不期望除 publisher 端⼝之外的其他端⼝处于活动状态。如果你想要快速关掉 socket 可以⽤ keepalive 或者 RTMP ping 等。timeout 默认值为 1 分钟。
timeout 60s;
ping
语法:ping value
上下⽂:rtmp, server
描述:RTMP ping 间隔。零值的话将 ping 关掉。RTMP ping 是⼀个⽤于检查活动连接的协议功能。发送⼀个特殊的包到远程连接,然后在
ping_timeout 指令指定的时间内期待⼀个回复。如果在这个时间⾥没有收到 ping 回复,连接断开。ping 默认值为⼀分钟。ping_timeout 默认值为 30秒。
ping 3m;
ping_timeout 30s;
ping_timeout
语法:ping_timeout value
上下⽂:rtmp, server
描述:请参考上⽂ ping 描述。
max_streams
语法:max_streams value
上下⽂:rtmp, server
描述:设置 RTMP 流的最⼤数⽬。数据流被整合到⼀个单⼀的数据流⾥。不同的频道⽤于发送命令、⾳频、视频等。默认值为 32,适⽤于⼤多数情况。
max_streams 32;
ack_window
语法:ack_window value
上下⽂:rtmp, server
描述:设置 RTMP 确认视窗⼤⼩。这是对端发送确认包到远端后应该收到的字节数量。默认值为 5000000。
ack_window 5000000;
chunk_size
语法:chunk_size value
上下⽂:rtmp, server
描述:流整合的最⼤的块⼤⼩。默认值为 4096。这个值设置的越⼤ CPU 负载就越⼩。这个值不能低于 128。
chunk_size 4096;
max_queue
语法:max_queue value
上下⽂:rtmp, server
描述:输⼊数据报⽂最⼤尺⼨。所有输⼊数据会被分割成报⽂(然后进⼀步分割为块)。报⽂在处理结束之前会放在内存⾥。理论上讲,接收到的报⽂很⼤的话对于服务器的稳定性可能会有影响。默认值 1M 对于⼤多数情况就⾜够了。
max_message 1M;
out_queue
out_cork
Access
allow
语法:allow [play|publish] address|subnet|all
上下⽂:rtmp, server, application
允许来⾃指定地址或者所有地址发布/播放。allow 和 deny 指令的先后顺序可选。
allow publish 127.0.0.1;
deny publish all;
allow play 192.168.0.0/24;
deny play all;
deny
语法:deny [play|publish] address|subnet|all
上下⽂:rtmp, server, application
描述:参考 allow 的描述。
Exec
exec
语法:exec command arg*
上下⽂:rtmp, server, application
描述:定义每个流发布时要执⾏的带有参数的外部命令。发布结束时进程终⽌。第⼀个参数应该是⼆进制可执⾏⽂件的完整路径。关于这个进程将会做些什么事没有任何假定。但这⼀特点在使⽤ ffmpeg 进⾏流转换时是很有⽤的。FFmpeg 被假定作为客户端连接到 nginx-rtmp 然后作为发布者输出转换流到 nginx-rtmp。类似于 $var/${var} 形式的替换可以在命令⾏使⽤:
* $name - 流的名字。
* $app - 应⽤名。
* $addr - 客户端地址。
* $flashver - 客户端 flash 版本。
* $swfurl - 客户端 swf url。
* $tcurl - 客户端 tc url。
* $pageurl - 客户端页⾯ url。
可以在 exec 指令中定义 Shell 格式的转向符⽤于写输出和接收输⼊。⽀持如下
* 截断输出 >file。
* 附加输出 >>file。
* 重定向描述符类似于 1>&2。
* 输⼊ <file。
以下 ffmpeg 调⽤将输⼊流转码为 HLS-ready 流(H264/AAC)。运⾏这个⽰例,FFmpeg 须编译为⽀持 libx264 & libfaac。
application src {
live on;
exec ffmpeg -i rtmp://localhost/src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -ar 44100 -ac 1 -f flv
rtmp://localhost/hls/$name 2>>/var/log/ffmpeg-$name.log;
}
application hls {
live on;
hls on;
hls_path /tmp/hls;
hls_fragment 15s;
}
exec_static
语法:exec_static command arg*
上下⽂:rtmp, server, application
描述:类似于 exec 指令,但在 nginx 启动时将运⾏定义的命令。因为(启动时)尚⽆会话上下⽂,不⽀持替换。
exec_static ffmpeg -i example/video.ts -c copy -f flv rtmp://localhost/myapp/mystream;
exec_kill_signal
语法:exec_kill_signal signal
上下⽂:rtmp, server, application
描述:设置进程终⽌信号。默认为 kill(SIGKILL)。你可以定义为数字或者符号名(POSIX.1-1990 信号)。
exec_kill_signal term;
exec_kill_signal usr1;
exec_kill_signal 3;
respawn
语法:respawn on|off
上下⽂:rtmp, server, application
描述:如果打开 respawn ⼦进程,进程终⽌时发布会仍然继续。默认为打开。
respawn off;
respawn_timeout
语法:respawn_timeout timeout
上下⽂:rtmp, server, application
描述:启动新的⼦实例之前,设置 respawn 超时时间。默认为五秒。
respawn_timeout 10s;
exec_publish
语法:exec_publish command arg*
上下⽂:rtmp, server, application
描述:指定发布事件触发的带有参数的外部命令。返回码是未解析的。这⾥可以⽤ exec 替换。另外,args 变量⽀持持有查询字符串参数。
exec_play
语法:exec_play command arg*
上下⽂:rtmp, server, application
描述:指定播放事件触发的带有参数的外部命令。返回码是未解析的。替换列表同 exec_publish。
exec_play_done
语法:exec_play_done command arg*
上下⽂:rtmp, server, application
描述:指定播放结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同 exec_publish。
exec_publish_done
语法:exec_publish_done command arg*
上下⽂:rtmp, server, application
描述:指定发布结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同 exec_publish。
exec_record_done
语法:exec_record_done command arg*
上下⽂:rtmp, server, application, recorder
描述:指定录制结束时触发的带有参数的外部命令。这⾥⽀持 exec_publish 的替代以及额外的变量 path 和 recorder。
# track client info
exec_play bash -c "echo $addr $pageurl >> /tmp/clients";
exec_publish bash -c "echo $addr $flashver >> /tmp/publishers";
# convert recorded file to mp4 format
exec_record_done ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $path.mp4;
Live
live
语法:live on|off
上下⽂:rtmp, server, application
描述:切换直播模式,即⼀对多⼴播。
live on;
meta
语法:meta on|off
上下⽂:rtmp, server, application
描述:切换发送元数据到客户端。默认为 on。
meta off;
interleave
语法:interleave on|off
上下⽂:rtmp, server, application
描述:切换交叉模式。在这个模式下,⾳频和视频数据会在同⼀个 RTMP chunk 流中传输。默认为 off。
interleave on;
wait_key
语法:wait_key on|off
上下⽂:rtmp, server, application
描述:使视频流从⼀个关键帧开始。默认为 off。
wait_key on;
wait_video
语法:wait_video on|off
上下⽂:rtmp, server, application
描述:在第⼀个视频帧发送之前禁⽤⾳频。默认为 off。可以和 wait_key 进⾏组合以使客户端可以收到具有所有其他数据的视频关键帧。然⽽这通常增加连接延迟。您可以通过在编码器中调整关键帧间隔来减少延迟。
wait_video on;
publish_notify
语法:publish_notify on|off
上下⽂:rtmp, server, application
描述:发送 NetStream.Publish.Start 和 NetStream.Publish.Stop 给⽤户。默认为 off。
publish_notify on;
drop_idle_publisher
语法:drop_idle_publisher timeout
上下⽂:rtmp, server, application
描述:终⽌指定时间内闲置(没有⾳频/视频数据)的发布连接。默认为 off。注意这个仅仅对于发布模式的连接起作⽤(发送 publish 命令之后)。
drop_idle_publisher 10s;
sync
语法:sync timeout
上下⽂:rtmp, server, application
描述:同步⾳频和视频流。如果⽤户带宽不⾜以接收发布率,服务器会丢弃⼀些帧。这将导致同步问题。当时间戳差超过 sync 指定的值,将会发送⼀个绝对帧来解决这个问题。默认为 300 ms。
sync 10ms;
play_restart
语法:play_restart on|off
上下⽂:rtmp, server, application
描述:使 nginx-rtmp 能够在发布启动或停⽌时发送 NetStream.Play.Start 和 NetStream.Play.Stop 到每个⽤户。如果关闭的话,那么每个⽤户就只能在回放的开始和结束时收到这些通知了。默认为 on。
play_restart off;
Record
record
语法:record [off|all|audio|video|keyframes|manual]*
上下⽂:rtmp, server, application, recorder
描述:切换录制模式。流可以被记录到 flv ⽂件。本指令指定应该被记录的:
* off - 什么也不录制
* all - ⾳频和视频(所有)
* audio - ⾳频
* video - 视频
* keyframes - 只录制关键视频帧
* manual - ⽤不⾃动启动录制,使⽤控制接⼝来启动/停⽌
在单个记录指令中可以有任何兼容的组合键。
record all;
record audio keyframes;
record_path
语法:record_path path
上下⽂:rtmp, server, application, recorder
描述:指定录制的 flv ⽂件存放⽬录。
record_path /tmp/rec;
record_suffix
语法:record_suffix value
上下⽂:rtmp, server, application, recorder
描述:设置录制⽂件后缀名。默认为 '.flv'。
record_suffix _recorded.flv;
录制后缀可以匹配 strftime 格式。以下指令
record_suffix -%d-%b-%y-%T.flv
将会产⽣形如 mystream-24-Apr-13-18:23:38.flv 的⽂件。所有⽀持 strftime 格式的选项可以在 strftime man page ⾥进⾏查。
record_unique
语法:record_unique on|off
上下⽂:rtmp, server, application, recorder
描述:是否添加时间戳到录制⽂件。否则的话同样的⽂件在每⼀次新的录制发⽣时将被重写。默认为 off。
record_unique on;
record_append
语法:record_append on|off
上下⽂:rtmp, server, application, recorder
描述:切换⽂件附加模式。当这⼀指令为开启是,录制时将把新数据附加到⽼⽂件,如果⽼⽂件丢失的话将重新创建⼀个。⽂件中的⽼数据和新数据没有时间差。默认为 off。
record_append on;
record_lock
语法:record_lock on|off
上下⽂:rtmp, server, application, recorder
描述:当这⼀指令开启时,当前录制⽂件将被 fcntl 调⽤锁定。那样可以在其他地⽅来核实哪个⽂件正在进⾏录制。默认为 off。
record_lock on;
在 FreeBSD 上你可以使⽤ flock ⼯具检查。在 Linux 上 flock 和 fcntl ⽆关,因此你需要去写⼀个简单的脚本来检查⽂件的锁定状态。以下isunlocked.py 是⼀个这样的脚本的⽰例。
[python]
1. #!/usr/bin/python
2.
3.
4. import fcntl, sys
5.
6.
7. sys.stderr.close()
8. fcntl.lockf(open(sys.argv[1], "a"), fcntl.LOCK_EX|fcntl.LOCK_NB)
record_max_size
语法:record_max_size size
上下⽂:rtmp, server, application, recorder
描述:设置录制⽂件的最⼤值。
record_max_size 128K;
record_max_frames
语法:record_max_frames nframes
上下⽂:rtmp, server, application, recorder
描述:设置每个录制⽂件的视频帧的最⼤数量。
record_max_frames 2;
record_interval
语法:record_interval time
上下⽂:rtmp, server, application, recorder
描述:在这个指令指定数量的(毫秒)秒之后重启录制。默认为 off。设置为 0 的话意味着录制中⽆延迟。如果 record_unique 为 off 的话所有记录⽚段会被写到同⼀个⽂件。否则(⽂件名)将附以时间戳以区分不同⽂件(给定的 record_interval 要⼤于 1 秒)。
record_interval 1s;
record_interval 15m;
recorder
语法:recorder name {...}
上下⽂:application
描述:创建录制块。可以在单个 application 中创建多个记录。上⽂提到的所有录制相关的指令都可以在 recorder{} 块中进⾏定义。继承⾼层次中的所有设置。
application {
live on;
# default recorder
record all;
record_path /var/rec;
recorder audio {nginx停止命令
record audio;
record_suffix .audio.flv;
}
recorder chunked {
record all;
record_interval 15s;
record_path /var/rec/chunked;
}
}
record_notify
语法:record_notify on|off
上下⽂:rtmp, server, application, recorder
描述:切换当定义录制启动或停⽌⽂件时发送 NetStream.Record.Start 和 NetStream.Record.Stop 状态信息(onStatus)到发布者。状态描述字段保存录制的名字(默认录制的话为空)。默认为 off。
recorder myrec {
record all manual;
record_path /var/rec;
record_notify on;
}
VOD
play
语法:lay dir|loc [dir|loc]*
上下⽂:rtmp, server, application
描述:播放指定⽬录或者 HTTP 地址的 flv 或者 mp4 ⽂件。如果此参数前缀是 那么就认为⽂件可以在播放前从远程 http 地址下载下来。注意播放是在整个⽂件下载完毕之后才开始。你可以使⽤本地 nginx 在本地机器缓存⽂件。
同⼀个 play 指令可以定义多个播放地址。当多个 play 指令定义时,地址列表将被合并,并进⾏从更⾼域中继承。尝试播放每⼀个地址,直到发现⼀个成功的地址。如果没有到成功地址,将发送错误状态到客户端。
索引的 FLV 播放具有随机查能⼒。没有索引的 FLV 则不具备查/暂停能⼒(重播模式)。使⽤ FLV 索引器(⽐如 yamdi)来编索引。
mp4 ⽂件只有在⾳频和视频编码都被 RTMP ⽀持时才可以播放。最常见的情况是 H264/AAC。
application vod {
play /var/flvs;
}
application vod_http {
play myserver/vod;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。