【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(一) RTMP 命令详解
源码地址:https://github.com/Tinywan/PHP_Experience
说明:
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 ;
}
application
语法:应用程序名称{...}
上下文:服务器
创建RTMP应用程序。 不像http位置应用程序名称不能是一个模式(正则?)。
server {
listen ;
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 http://mworker.baidu.com/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重定向到另一个应用程序,其名称取自Location
HTTP响应头。否则,连接被丢弃。
注意:这个指令不应用范围允许的,因为应用还处于连接阶段不明。
HTTP请求接收多个参数。POST方法用于应用程序/ x-WWW的形式了urlencoded MIME类型。下面的参数被传递给调用者:
- 调用=连接
- 地址 - 客户端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 'http://sewise.amai8.com/lib/jwplayer/jwplayer.flash.swf' (length=55) //客户端播放器地址
public 'tcurl' => string 'rtmp://121.26.206.11/live/' (length=27) //直播流播放器地址
public 'pageurl' => string 'http://sewise.amai8.com/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 http://150.261.11.180/control/drop/publisher?app=live&name=4001482742932
断开当前客户端播放的链接,但是不会断开OBS的推流系统
curl http://150.26.11.180/control/drop/client?app=live&name=4001482742932&addr=115.192.190.59&clientid=95
curl http://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 http://example.com/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 http://example.com/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[], "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 ;
record_interval
语法:record_interval time
context:rtmp,server,application,recorder
重新启动录音后这个数(毫秒)秒。默认关闭。零表示录音之间没有延迟。如果record_unique关闭,则所有记录片段都将写入同一个文件。否则附加时间戳,使文件不同(给定record_interval超过1秒)。
record_interval 1s; record_interval 15m;
timeout
syntax: timeout value
context: rtmp, server
套接字超时 该值主要用于写入。大多数时间RTMP模块不会期望除发布商套接字之外的所有套接字上都有任何活动。如果想要断开套接字来快速断开连接,请使用活动工具,如keepalive或RTMP ping。默认为1分钟。
timeout 60s;
ping
syntax: ping value
context: rtmp, server
RTMP ping间隔。零点关闭。RTMP ping是用于主动连接检查的协议功能。一个特殊的数据包被发送到远程对等体,并且在ping_timeout指令指定的超时期间预期回复。如果在这段时间内没有收到ping回复,则连接被关闭。ping的默认值为1分钟。默认ping超时为30秒。
ping 3m;
ping_timeout 30s;
max_streams
语法:max_streams value
背景:RTMP,服务器
设置RTMP流的最大数量。 数据流被复用到单个数据流中。 不同的通道用于发送命令,音频,视频等。默认值为32,这在许多情况下通常是确定的。
max_streams ;
ack_window
设置RTMP确认窗口大小。 它是接收的字节数,在该字节之后,对等体应向远端发送确认分组。 默认值为5000000。
ack_window ;
chunk_size
syntax: chunk_size value
context: rtmp, server
流复用的最大块大小。 默认值为4096.该值越大,CPU开销越低。 此值不能小于128。
chunk_size ;
ack_window
syntax: ack_window value
context: rtmp, server
设置RTMP确认窗口大小。这是接收到的字节数,在此之后,对等体应该向远端发送确认数据包。默认值为5000000。
ack_window ;
chunk_size
语法:chunk_size value
context:rtmp,server
流多路复用的最大块大小。默认值为4096.这个值越大,CPU开销越低。该值不能小于128。
chunk_size ;
max_queue
max_message
语法:max_queue value
context:rtmp,server
输入数据消息的最大大小。所有输入数据都分为消息(还有更多的块)。等待它完成时,部分消息保存在内存中。在理论上,传入的消息可能非常大,这可能是服务器稳定性的一个问题。默认值1M对于很多情况都是足够的。
max_message 1M;
buflen
语法:buflen time
context:rtmp,server
设置默认缓冲区长度。通常客户端set_buflen
在播放之前发送RTMP 命令,并重置此设置。默认是1000 ms
。
buflen 5s;
说明:
记录器 - 记录器名称
path - 记录文件路径(recorded file path) (/tmp/rec/mystream-1389499351.flv)
filename - 省略目录的路径(path with directory omitted )(mystream-1389499351.flv)
basename - 扩展名省略的文件名(file name with extension omitted )(mystream-1389499351)
dirname - 目录路径(directory path) (/tmp/rec)
Nginx RTMP传递参数:
exec_record_done /home/www/bin/rtmpRecorded.sh $name $path $filename $basename $dirname;
基本视频信息获取实际案例记录
FILESIZE=`stat -c "%s"basename.mp4`
等同于:FILESIZE=`stat --format "%s"basename.mp4`
ffmpeg -i 4001481608583-1481696526.flv 2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
ffmpeg -y -ss 00:00:10 -i $fullname -vframes 1 $VIDEO_PATH/$basename.jpg
【4】转码成MP4
ffmpeg -y -i $fullname -vcodec copy -acodec copy $VIDEO_PATH/$basename.mp4
下面全部stat命令是可用的选项:
%a 八进制表示的访问权限
%A 可读格式表示的访问权限
%b 分配的块数(参见 %B)
%B %b 参数显示的每个块的字节数
%d 十进制表示的设备号
%D 十六进制表示的设备号
%f 十六进制表示的 Raw 模式
%F 文件类型
%g 属主的组 ID
%G 属主的组名
%h 硬连接数
%i Inode 号
%n 文件名
%N 如果是符号链接,显示器所链接的文件名
%o I/O 块大小
%s 全部占用的字节大小
%t 十六进制的主设备号
%T 十六进制的副设备号
%u 属主的用户 ID
%U 属主的用户名
%x 最后访问时间
%X 最后访问时间,自 Epoch 开始的秒数
%y 最后修改时间
%Y 最后修改时间,自 Epoch 开始的秒数
%z 最后改变时间
%Z 最后改变时间,自 Epoch 开始的秒数
Setup Nginx-RTMP on Ubuntu 14.04:https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04
Ubuntu 14.04 安装Nginx的RTMP模块:https://www.vultr.com/docs/setup-nginx-rtmp-on-ubuntu-14-04
【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(一) RTMP 命令详解的更多相关文章
- 官方文档Core Technologies - Part 1
首先介绍系列文章内容及Spring Framework官方文档情况. 在这一系列学习中,我阅读的主要资源是5.1.2 Reference Doc.,以及论坛大神的讲解blog.另外,Spring官方也 ...
- python附录-re.py模块源码(含re官方文档链接)
re模块 python官方文档链接:https://docs.python.org/zh-cn/3/library/re.html re模块源码 r"""Support ...
- python附录-builtins.py模块str类源码(含str官方文档链接)
python附录-builtins.py模块str类源码 str官方文档链接:https://docs.python.org/3/library/stdtypes.html#text-sequence ...
- 第0001题 : 产生随机数(顺便读random模块官方文档)
看这个之前我准备先看一下random模块的官方文档... 在整个随机模块中, 最基础的就是random, 它产生一个 [0.0, 1.0)的浮点数. 这个模块下所有的函数实际上是绑定在一个叫做ran ...
- python-schedule模块(定时任务)基于官方文档总结
一.模块安装 pip3 install schedule 官方文档 二.常用的使用案例 #基本格式 #创建方法 def func(): print("方法") #创建定时 sche ...
- 【翻译】Django Channels 官方文档 -- Tutorial
Django Channels 官方文档 https://channels.readthedocs.io/en/latest/index.html 前言: 最近课程设计需要用到 WebSocket,而 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC
内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...
- 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解
注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...
- CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)
安装前记: 近来容器对企业来说已经不是什么陌生的概念,Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿 ...
随机推荐
- ReactJS实用技巧(1):JSX与HTML的那些不同
在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑.不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档. JSX本质上与 ...
- mybati缓存机制之一级缓存
在月黑风高的某天夜晚,boss chen语重心长的发条了消息给小草说:“小草啊,是时候写写博客来记录平常自己积累的东西了......”.小草一听,平常没有写博客的习惯,在平常开发中只是用笔记记录自 ...
- OD之去除nag弹窗(四)
在某些方面,一个软件如果没有注册的话,老是会弹出烦人的注册弹窗,就如下图一样: 出现了两次弹窗,开始一次,关闭后又一次,老办法,拖进OD进行分析;不过看出程序很简单,就出现了messagebox的调用 ...
- github添加ssh连接用户
最近打算用flask写一个自己的博客网站,打算把代码放在GitHub上,使用ssh访问.记录下GitHub配置ssh用户的流程. 1.在本地电脑或云服务器上生成ssh公钥和私钥,window下可以进入 ...
- 《Linux内核 》MOOC 课程
姬梦馨 原创微博 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习笔记 一:什么是冯诺依曼体系结构? ...
- C++ Makefile文件编写
对现有的一个C++动态库文件和调用程序,分别编写Makefile文件,从零开始,这里把自己弄明白的一些东西分享给大家. 1.必须明确Linux下,C++的编译器是g++,C语言的是gcc.网上大多数又 ...
- Mininet安装
Mininet 安装 根据SDNLAB上的实验进行安装.连接地址 需要注意的是切换到用户目录下进行clone github上的源码. 1.卸载之前安装的Mininet 最好是先到目录下看是否有这些文件 ...
- PPT 遥控器
1. 下载 最新版本: 百度袋鼠输入: http://daishu.baidu.com/?from=pptweb 百度PPT遥控器:http://ppt.baidu.com/ 2. 安装过程忽略 3. ...
- 通过第三方软件打开sqlite
1.SQLite Expert 使用之前,可以先下载SQLite Expert,方便查看.db3数据库 下载链接是http://www.sqliteexpert.com/ 可以谷歌找到licen ...
- angular2 bootstrap modal
----html------- <div #ele class="modal fade " style="z-index: 9999" data-back ...