Core
-
rtmp
-
语法: rtmp {…}
-
上下文: root
-
包含所有RTMP设置的块
-
server
-
语法: server {…}
-
上下文: rtmp
-
声明RTMP服务器实例
rtmp {
server {
}
}
server {
listen 1935;
}
-
application
-
语法: application name {…}
-
上下文: server
-
创建RTMP应用程序(类似电视频道),与http 配置中的location不一样,名字不可以模式匹配
server {
listen 1935;
application myapp {
}
}
-
timeout
-
语法: timeout value
-
上下文: rtmp, server
-
套接字超时时间,该值主要用于写入。大多数时间,RTMP模块不会期望除发布者套接字之外的所有套接字上的任何活动。如果您希望断开的套接字快速断开连接,请使用诸如keepalive或RTMP ping之类的活动工具。 默认值为1分钟。
timeout 60s;
Access
-
allow
-
语法:allow [play|publish] address|subnet|all
-
上下文: rtmp, server, application
-
允许从指定的地址或所有地址推流/拉流,按表面的顺序检查“允许/拒绝”指令。
allow publish 127.0.0.1;
deny publish all;
allow play 192.168.0.0/24;
deny play all;
-
deny
-
语法: [play|publish] address|subnet|all
-
上下文: rtmp, server, application
-
请参阅允许描述。
Exec
-
exec_push
-
语法: exec_push command arg*
-
上下文: rtmp, server, application
-
指定带有要在每个已发布流上执行的参数的外部命令,当发布停止时,该过程终止.二进制的完整路径应指定为第一个参数。没有关于此过程应该做什么的假设。但是,此功能与ffmpeg一起用于流转码很有用.FFmpeg应该作为客户端连接到nginx-rtmp,并以发布者的身份输出转码后的流回到nginx-rtmp。 可以在命令行中使用$ var / $ {var}形式的替换
-
$name: 流的名字
-
$app: application的名字
-
$addr: 客户端地址
-
$flashver: 客户端flash版本
-
$swfurl: 客户端swf url
-
$tcurl: 客户端tc url
-
$pageurl: 客户端页面url
可以在exec_push指令中指定Shell样式的重定向,以编写输出并接受输入。 支持的是
-
截断输出: >file
-
附加输出: >>file
-
描述符重定向如:1>&2
-
输入: <file
确保重定向字符和流名称/数字之间没有空格。您可以指定要执行的命令的完整路径或简短的命令名称。 在后一种情况下,将在PATH环境变量指定的目录中查找二进制文件。 默认情况下,nginx清除环境,这通常会使rtmp模块仅运行位于/ bin和/ usr / bin等标准目录中的二进制文件。 为了使其始终有效,请使用以下nginx指令保留原始PATH变量值。
env PATH;
以下ffmpeg调用将传入流转码为支持HLS的流(H264 / AAC)。 FFmpeg应该使用libx264支持进行编译,以使此示例正常工作。
application src {
live on;
exec_push ffmpeg -i rtmp://localhost/src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec aac -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 15
s;
}
-
exec_pull
-
语法: exec_pull command arg*
-
上下文: rtmp,server,application
-
指定带有在播放事件上执行的参数的外部命令。
该命令在第一个客户端连接到流时执行,并在最后一个客户端断开连接时终止。
该指令可以为本地客户端提取任何格式的远程流。
该功能仅在单工模式下可靠地工作。
原因是我们不能确保外部流程始终连接到正确的工作人员。
显然它将连接到随机的一个。
尽管这在大多数情况下仍然可以使用,但不建议使用该架构,但它会不稳定且容易出错。
指令参数与exec_push相同。
application myapp {
live on;
exec_options on;
exec_pull ffmpeg -i http://example.com/tv1.ts -c copy -f flv rtmp://localhost/$app/$name name=mystream;
exec_pull ffmpeg -i http://another.example.com/video_plus.ts -c copy -f flv rtmp://localhost/$app/$name name=anotherstream;
}
-
exec
-
语法: exec command arg*
-
上下文: rtmp,server,application
-
exec是exec_push的别名
-
exec_options
-
语法: exec_options on|off
-
上下文: application
-
该指令切换exec选项模式。
激活后,您可以添加exec-family指令选项。
支持的唯一exec选项是name。
使用此选项可以仅将exec应用于指定的流。 默认为关闭。
exec_options on;
# 仅针对“mystream”调用my_on_publish_command
exec_publish my_on_publish_command name=mystream;
# 仅针对“another”调用my_on_play_command
exec_play my_on_play_command name=another;
# 为不同的流执行不同的FFMPEG命令
exec_pull ffmpeg -i http://example.com/abc.ts -c copy -f flv rtmp://localhost/$name/$app name=mystream;
exec_pull ffmpeg -i http://my.example.com/tele.ts -c copy -f flv rtmp://localhost/$name/$app name=tv;
exec_pull ffmpeg -i http://another.example.com/hello/f.ts -c copy -f flv rtmp://localhost/$name/$app name=fun;
-
exec_static
-
语法: exec_static command arg*
-
上下文: rtmp, server, application
-
与exec类似,但是在nginx启动时运行指定的命令。 由于没有会话上下文,因此不支持替换。
exec_static ffmpeg -i http://example.com/video.ts -c copy -f flv rtmp://localhost/myapp/mystream;
-
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
-
指定带有在play_done事件上执行的参数的外部命令。
不分析返回码。
替换列表与exec_publish相同。
-
exec_publish_done
-
语法: exec_publish_done command arg*
-
上下文: rtmp, server, application
-
指定带有要在publish_done事件上执行的参数的外部命令。
不分析返回码。
替换列表与exec_publish相同。
-
exec_record_done
-
语法: exec_record_done command arg*
-
上下文: rtmp, server, application, recorder
-
指定带有录制完成时要执行的参数的外部命令。
此处支持替换exec_publish以及其他变量
-
recorder - 录制者的名称
-
path - 录制的文件地址(/tmp/rec/mystream-1389499351.flv)
-
filename - 省略目录的路径(mystream-1389499351.flv)
-
basename - 扩展名省略的文件名(mystream-1389499351)
-
dirname - 目录路径(/tmp/rec)
-
例子
# 跟踪客户端信息
exec_play bash -c "echo $addr $pageurl >> /tmp/clients";
exec_publish bash -c "echo $addr $flashver >> /tmp/publishers";
# 将录制的文件转换为mp4格式
exec_record_done ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $dirname/$basename.mp4;
Live
-
live
-
语法: live on|off
-
上下文: rtmp, server, application
-
切换实时模式,即一对多广播。
live on;
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格式选项。
-
record_unique
-
语法: record_unique on|off
-
上下文: rtmp, server, application, recorder
-
如果启用,则将当前时间戳添加到录制的文件。 否则,每次进行新记录时都会重写相同的文件。 默认为关闭。
record_unique on;
-
record_append
-
语法: record_append on|off
-
上下文: rtmp, server, application, recorder
-
切换文件追加模式。
设置开启后,会将新数据追加到旧文件中,或者在丢失时创建新数据。
文件中的旧数据和新数据之间没有时间间隔。 默认为关闭。
record_append on;
-
recorder
-
语法: recorder name {…}
-
上下文: application
-
创建recorder块。
可以使用单个application创建多个recorder
可以在recorder {}块中指定所有上述与记录有关的指令。
所有设置都继承自更高级别。
application {
live on;
# 默认的 recorder
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
Video on demand
-
play
-
语法: play dir|http://loc [dir|http://loc]*
-
上下文: rtmp, server, application
-
从指定目录或HTTP位置播放flv或mp4文件。
如果参数以http://开头,则假定在播放之前应从远程http位置下载文件。
下载整个文件后,才开始播放音符。
您可以使用本地nginx在本地计算机上缓存文件。
可以在一个播放指令中指定多个播放位置。
指定多个播放指令后,位置列表将合并并从更高的作用域继承。
尝试播放每个位置,直到找到成功的位置。
如果找不到这样的位置,则会将错误状态发送到客户端。
索引的FLV具有随机搜寻功能。
未索引的FLV会在禁用查找/暂停的情况下播放(仅重启模式)。
使用FLV索引器(例如yamdi)进行索引。
如果您播放用record指令录制的FLV,请不要忘记在播放前对其进行索引。 它们是未索引创建的。
仅当RTMP支持视频和音频编解码器时,才能播放Mp4文件。 最常见的情况是H264 / AAC。
application vod {
play /var/flvs;
}
application vod_http {
play http://myserver.com/vod;
}
application vod_mirror {
# 首先尝试本地位置,然后访问远程位置
play /var/local_mirror http://myserver.com/vod;
}
举例:Playing /var/flvs/dir/file.flv:(会进行地址的拼接,配置中的/var/flvs与地址中的/dir/file.flv拼接)
ffplay rtmp://localhost/vod
vod后面的两个斜杠使ffplay使用vod和应用程序名称,并将URL的其余部分用作播放路径。
-
play_temp_path
-
语法: play_temp_path dir
-
上下文: rtmp, server, application
-
设置播放前远程VOD文件的存储位置。 默认值为/ tmp;
play_temp_path /www;
play http://example.com/videos;
-
play_local_path
-
语法: play_local_path dir
-
上下文: rtmp, server, application
-
设置完全下载后从play_temp_path目录复制的远程VOD文件的位置。
空值将禁用该功能。
默认情况下为空。 该功能可用于本地缓存远程文件。
此路径应与play_temp_path在同一设备上。
# 在/ tmp / videos中搜索文件。如果找不到,则从远程位置播放并存储在/ tmp / videos中
play_local_path /tmp/videos;
play /tmp/videos http://example.com/videos;