Application 创建一个RTMP应用,这里有点区别于http的location
 Timeout 60s 
 stocket超时,可以配合keepalive和ping值来实现不让服务器端长期处于监听连接客户端状态,实现快速关掉socket
 Ping 3m
 ping_timeout 30s
 RTMP ping用于检查活动连接的协议。发送一个特殊的包远程连接,在ping_timeout指定时间内期待一个回复,如果没有收到回复,连接断开
 max_streams 32
 设置RTMP流的最大数目,单一流数据最大限制,一般默认的32就可以了
 ack_window 5000000
 设置RTMP窗口的大小
 chunk_size 4096
 数据块大小 设置值越大CPU负载就越小
 max_queue
 最大队列数,一般默认即可
 max_message 1M
 输入数据消息的最大大小。所有输入数据消息都会保存在内存中,等待完成流媒体转发。在理论上传入的消息可以是非常大,对服务器稳定性影响较大,所以一般默认即可。
 out_queue
 out_cork
 Buflen 5s
 设置默认缓冲区长度。通常客户端发送播放前RTMP set_buflen命令并重置该设置
 访问控制
 Access
 Allow/deny
 允许来自指定地址或者所有地址发布/播放
 Allow public 127.0.0.1
 Deny publish all;
 Allow play 192.168.0.0/24
 Deny play all;
 Exec命令
 Exce 
 exec_options on;
 启动一些exec指令选项,通过一些exec事件来干预整个RTMP流
 可以仔细一些外部编解码功能
 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;
 Exce_statc 
 类似exce,属于静态命令,不支持传递上下文参数
 Exec_kill_signal term;
 Exec_kill_signal user1;
 Exec_kill_signal 3;
 Exec_pull 
 Exec_push
 Exec_publish
 指定与参数外部命令要在发布事件执行。
 Exec_play
 指定与要在打开事件执行外部命令
 Exec_play_done
 指定要在打开完成事件执行外部命令
 Exec_publish_done
 Exec_record_done
 例子
 exec_play bash -c “echo $addr $pageurl >> /tmp/clients”
 Exec_publish base -c “echo $addr $flashver >> /tmp/publishers”
 转录
 Exec_record_done ffmpeg -y -i $path -acodec libmp31ame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4
 Live 模式
 Live on
 切换直播模式,即一对多广播
 Meta on/copy/off
 奇幻发送元数据到客户端 默认on
 Interleave on/off
 切换交叉模式。在该模式下,音视频会在同一个RTMPchunk流中传输。默认为off
 wait_key on|off
 使视频流从一个关键帧开始,默认为off
 wait_video on|off
 在一个视频帧发送前禁用音频。默认off
 通过wait_key/wait_video进行组合以使客户端可以收到具有所有其他数据的视频关键帧。但这样会增加连接延迟。不过可以通过编解码器中调整关键帧间隔来减少延迟。
 Publish_notify on
 发送NetStream.Publish.Start和NetStream.Publish.Stop给用户,默认off
 Drop_idle_publisher 10s
 终止指定时间内闲置(没有音频、视频)的发布连接,默认为off。注意这个仅仅对于发布模式的连接起作用(发送publish命令之后)
 Sync 10ms
 同步音视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过sync指定值,将会发送一个绝对帧来解决这个问题,默认为300ms
 Play_restart off
 使nginx-rtmp能够在发布启动或者停止时发送NetStream.Play.Start 和 NetStrem.Play.Stop到每个用户。如果关闭的话,那么每个用户就只能在回放的开始结束时收到该通知了。默认为on
 Record 模式
 Record off|all|audio|video|keyframes|manual
 切换录制模式,流可以被记录到flv文件
 Off 不录制
 All 录制音频和视频
 Audio
 Video
 Keyframes 只录制关键视频帧
 Manual 不自动启动录制,使用控制接口来进行启动和停止
 Record_path /tmp/rec
 指定录制的flv文件存放目录
 Record_suffix -%d-%b-%y-%T.flv
 录制后缀strftime格式
 Record_unique on|off
 是否添加时间戳到录制文件,防止文件被覆盖,默认off
 record_append on|off
 切换文件附加模式。开启后,录制时将新数据附加到旧文件后面。默认off
 record_lock on|off
 锁定文件,调用系统的fcntl
 record_max_size 128K
 设置录制文件的最大值
 Record_max_frames 2
 设置每个录制文件的视频帧最大数量
 Record_interval 1s/15m
 在这个指令指定的时间之后重启录制。默认off设置为0表示录制中无延迟。如果record_unique为off时所有的记录都会被写到同一个文件中。否则就会以时间戳区分在不同文件
 Record_notify on|off
 奇幻当定义录制启动或者停止文件时发送NetStream.Record.Start和NetStream.Record.Stop状态信息onStatus到发布者。
 应用
 Application rtmp{
 Live on;
 Record all;
 Record_path /var/rec;
 Recorder audio{
 Record audio;
 Record_suffix .audio.flv;
 }
 Recorder chunked{
 Record all;
 Record_interval 15s;
 Record_path /var/rec/chunked;
 }
 }
 创建录制块。可以在单个application中创建多个记录 。
 VOD媒体
 Play dir|http://loc
 播放指定目录或者HTTP地址的flv或者mp4文件。注意HTTP播放是要在整个文件下载完后才开始播放。同一个play可以播放多个视频地址(用于负载)。MP4格式要在编解码都被RTMP支持才可以播放。一般常见的就是H264/AAC
 Application vod{
 Play /var/flvs;
 }
 Application vod_http{
 Play http://localhost/vod;
 }
 Play_temp_path /www
 设置远程VOD文件完全下载之后复制于play_temp_path之后的路径。空值的话禁用此功能。
 Play_local_path dir
 在播放前设置远程存储VOD文件路径,默认/tmp
 Play_local_path /tmp/videos;
 Paly /tmp/videos http://localhost/videos
 表示播放视频,先播放本地缓存,如果没有的话,从localhost/videos下载到本地/tmp/videos后,在进行播放
 Relay模式
 Pull url [key=value]
 创建pull中继。主要是从远程服务器拉取流媒体。并进行重新发布。
 Url语法 [rtmp://]host[:port][/app[/playpath]] 如果application找不到那么将会使用本地application名,如果找不到playpath那么久用当前流名称。
 参数如下(使用Key=Value方式)
 app 明确application名
 Name 捆绑到relay的bending流名称。如果为空,那么会使用application中所有本地流
 tcUrl
 pageUrl
 swfUrl
 flashVer
 playPath
 Live
 Start
 Stop
 Static
 Pull rtmp://cdn.example.com/main/ch?id=1234 name=channel;
 Push url [key=value]
 与pull类似,只是push推送发布流到远程服务器。
 Push_reconnect 1s
 在断开连接后,在push重新连接钱等待的时间,默认3秒
 Session_relay on;
 切换会话relay模式。在这种情况下关闭时relay销毁。
 Notify 模式
 这个功能主要是提供HTTP回调。当发送一些连接操作是,一个HTTP请求异步发送。命令处理会被暂停挂起,知道它返回结果代码。当HTTP返回2xx成功状态码时,RTMP会话继续。3xx状态码会使RTMP重定向到另一个从HTTP返回头获取到的application,否则连接丢失。其他状态码,连接断开。目前用来做简单的鉴权。
 On_connect url
 设置HTTP连接回调。当客户分发连接命令时。
 例子:
 On_connect http://localhost/my_auth;
 Location /on_connect{
 If($arg_flashver != “my_secret_flashver”){
 Rewrite ^.*$ fallback?permanent;
 }
 }
 On_play url
 设置HTTP播放回调。分发客户分发播放命令时。
 http {
 Location /redirect {
 Rewrite ^.*$ newname?permanent;
 }
 }
 Rtmp{
 Application myqpp{
 Live on;
 On_play http://localhost/redirect;
 }
 }
 On_publish
 On_doone
 On_play_done
 On_publish_done
 On_record_done
 On_update
 Notify_update_timeout
 设置on_update回调时间
 Notify_update_strict on|off
 Notify_relay_redirect on
 Notify_method get
 设置HTTP方法通知,默认是application/x-www-form-urlencodeed 的POST内容类型。有时候可能会需要GET方法,在nginx的http{}部分处理调用。在这种情况下可以使用arg_*变量去访问参数。
 例如如果是method为get时
 Location /on_play{
 If($arg_pageUrl ~* localhost){
 Return 200;
 }
 Return 500;
 }
 HLS 模式
 Hls on|off
 使application 切换HLS协议直播
 Hls_path /tmp/hls;
 设置HLS播放列表和分段目录。这一目录必须在nginx启动前就已经存在。
 Hls_fragment 15s;
 设置HLS分段长度,默认5秒,这个跟直播延迟有比较大的影响
 Hls_playlist_length 20m;
 设置HLS播放列表长度,默认30秒。这个跟直播缓存有关。
 Hls_sync time
 设置HLS时间戳同步阈值。默认2ms。这个功能防止由低分辨率RTMP(1KHz)转换到高分辨率MPEG-TS(90KHz)之后出现的噪音。
 Hls_continuous on|off
 切换HLS连续模式,默认off。
 Hls_nested on|off
 切换HLS嵌套模式。默认off。
 Hls_cleanup on|off;
 切换HLS清理。默认on
 AccessLog日志
 Access_log off|path [format_name]
 Log_format new_format ‘$remote_addr';
 Access_log logs/rtmp_access.log new_format;
 Log_format 指定日志格式
 创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有:
 * connection - 连接数。
 * remote_addr - 客户端地址。
 * app - application 名。
 * name - 上一个流名。
 * args - 上一个流播放/发布参数。
 * flashver - 客户端 flash 版本。
 * swfurl - 客户端 swf url。
 * tcurl - 客户端 tcUrl。
 * pageurl - 客户端页面 url。
 * command - 客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。
 * bytes_sent - 发送到客户端的字节数。
 * bytes_received - 从客户端接收到的字节数。
 * time_local - 客户端连接结束的本地时间。
 * session_time - 持续连接的秒数。
 * session_readable_time - 在可读格式下的持续时间。
 默认的日志格式叫做 combined。这里是这一格式的定义:
 $remote_addr [$time_local] $command "$app" "$name" "$args" - 
 $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)
 Limits限制
 max_connections number;
 设置rtmp引擎最大连接数,默认off
 Application hls{
 Live on;
 Hls on;
 Hls_path /tmp/hls;
 Hls_fragment 15s;
 }
  |