源码地址:https://github.com/Tinywan/PHP_Experience

说明:

  rtmp的延迟主要取决于播放器设置,但流式传输软件,流的比特率和网络速度(以及响应时间“ping”)可能会对延迟产生影响,具有播放器的本地rtmp服务器 使用“否”缓冲区(如0.1-0.2秒缓冲区等)可能会在0.8-1.2秒之间总是延迟,当事情正好工作时

nginx配置文件

  1. rtmp {
  2. server {
  3. listen 1935;
  4. chunk_size 4096;
  5.  
  6. application live {
  7. live on;
  8. record off;
  9.         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;
  10. }
  11. application live360p {
  12. live on;
  13. record off;
  14. allow publish 127.0.0.1;
  15. allow publish 0.0.0.0;
  16. deny publish all;
  17. }
  18. }
  19. }

以上为vlc播放测试结果:分别为720 和 360

命令详解

RTMP

语法:rtmp {...}
上下文:root
保存所有RTMP设置的块

server

语法:server {...}
上下文:rtmp
声明RTMP服务器实例

  1. rtmp {
  2. server {
  3. }
  4. }

listen

语法:listen(addr [:port] | port | unix:path)[bind] [ipv6only = on | off] [so_keepalive = on | off | keepidle:keepintvl:keepcnt | proxy_protocol]
上下文:服务器

将监听套接字添加到NGINX以接受RTMP连接

  1. server {
  2. listen ;
  3. }

application

语法:应用程序名称{...}
上下文:服务器

创建RTMP应用程序。 不像http位置应用程序名称不能是一个模式(正则?)。

  1. server {
  2. listen ;
  3. application myapp {
  4. }
  5. }

timeout

语法:超时值
上下文:rtmp,服务器

套接字超时。 这个值主要用于写作。 大多数情况下,RTMP模块不会期望除发布者套接字以外的所有套接字上的任何活动。 如果你想断开套接字快速断开连接,可以使用keepalive或RTMP ping等有效工具。 默认值是1分钟。

  1. timeout 60s;

ping

语法:ping 值
上下文:rtmp,服务器

RTMP ping时间间隔。 零点关闭。 RTMP ping是用于活动连接检查的协议功能。 一个特殊的数据包被发送到远程对等体,并且在一个由ping_timeout指令指定的超时期限内得到应答。 如果在这段时间内没有收到ping应答,则连接关闭。 ping的默认值是1分钟。 默认的ping超时时间是30秒。

  1. ping 3m;
  2. 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请求方式:

  1.      $app = $_GET['app'];
  2. $swfurl = $_GET['swfurl'];
  3. $tcurl = $_GET['tcurl'];
  4. $pageurl = $_GET['pageurl'];
  5. $addr = $_GET['addr'];
  6. $clientid = $_GET['clientid'];
  7. $call = $_GET['call'];
  8. $name = $_GET['name'];

on_publish_done

语法:on_publish_done url
上下文:rtmp, server, application
描述:等同于 on_done 的表现,但只适用于发布结束事件。

  1.     $app = $_GET['app'];
  2. $swfurl = $_GET['swfurl'];
  3. $tcurl = $_GET['tcurl'];
  4. $pageurl = $_GET['pageurl'];
  5. $addr = $_GET['addr'];
  6. $clientid = $_GET['clientid'];
  7. $call = $_GET['call'];
  8. $name = $_GET['name'];

on_publish_done和on_publish的不同的区别就是on_publish(call=publish),而on_publish_done(call=publish_done)

实际案例:

  1.        notify_method get;
  2. application live {
  3. live on;
  4. on_publish http://mworker.baidu.com/Notify/Notify;
  5. }

注意要点:要使用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类型。下面的参数被传递给调用者:

  • 调用=连接
  • 地址 - 客户端IP地址
  • 应用 - 应用名称
  • flashVer - 客户端flash版本
  • swfUrl - 客户端SWF网址
  • tcUrl - tcUrl
  • PAGEURL - 客户端页面网址

如何使用,官方都说了要加载

除了上述项目明确地传递给connect命令的所有参数也与回调发送。您应当区分连接参数从播放/发布参数。玩家通常具有播放/流发布名设置连接字符串分开的一种特殊方式。作为一个例子下面是这些参数是如何在JWPlayer设置

  1. object(stdClass)[7]
  2. public 'app' => string 'live' (length=4)
  3. public 'flashver' => string 'WIN 24,0,0,186' (length=14)
  4. public 'swfurl' => string 'http://sewise.amai8.com/lib/jwplayer/jwplayer.flash.swf' (length=55) //客户端播放器地址
  5. public 'tcurl' => string 'rtmp://121.26.206.11/live/' (length=27)  //直播流播放器地址
  6. public 'pageurl' => string 'http://sewise.amai8.com/player/jw_player' (length=40)
  7. public 'addr' => string '218.108.35.150' (length=14) //客户端播放地址
  8. public 'epoch' => string '982956199' (length=9) //这个每次都会去变得,VLC、手机、浏览器、播放器
  9. public 'call' => string 'connect' (length=7)

断开OBS推送流到服务器(当然了客户端也会同时断掉的)

  1. curl http://150.261.11.180/control/drop/publisher?app=live&name=4001482742932

断开当前客户端播放的链接,但是不会断开OBS的推流系统

  1. curl http://150.26.11.180/control/drop/client?app=live&name=4001482742932&addr=115.192.190.59&clientid=95
  1. curl http://150.26.11.180/control/drop/client?app=live&name=4001482742932&clientid=116

实践操作记录:200 OBS可以推流。500 OBS 推流不可以

  1. 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参数单独限制每个用户的播放持续时间。

  1. on_update http://example.com/update;

推流地址:rtmp://192.168.18.143/live/880?wsSecret=e2112a78822bf4ea9cdb3989e114344c&wsTime=1479196093

回调返回的所有参数:

  1. 'app' => string 'live' (length=4)
  2. 'flashver' => string 'LNX 9,0,124,2' (length=13)
  3. 'swfurl' => string '' (length=0)
  4. 'tcurl' => string 'rtmp://192.168.18.143:1935/live' (length=31)
  5. 'pageurl' => string '' (length=0)
  6. 'addr' => string '192.168.18.73' (length=13)
  7. 'clientid' => string '3321' (length=4)
  8. 'call' => string 'update_play' (length=11)
  9. 'time' => string '728' (length=3)
  10. 'timestamp' => string '716600' (length=6)
  11. 'name' => string '880' (length=3)
  12. 'wsSecret' => string 'e2112a78822bf4ea9cdb3989e114344c' (length=32)
  13. 'wsTime' => string '1479196093' (length=10)

播放客户端IP地址:192.168.18.73

on_record_done

语法:on_record_done url
背景:RTMP,服务器,应用程序,记录

设置record_done回调。除了常见的HTTP回调变量它接收到以下值

  • 记录 - 在配置或空字符串内联录音机录像机名
  • 路径 - 录制的文件路径
  1. on_record_done http://example.com/recorded;

该URL地址一GET方式获取所有的参数如下:

  1. 'app' => string 'live' (length=4)
  2. 'flashver' => string 'FMLE/3.0 (compatible; FMSc/1.0)' (length=31)
  3. 'swfurl' => string 'rtmp://192.168.18.143/live' (length=26)
  4. 'tcurl' => string 'rtmp://192.168.18.143/live' (length=26)
  5. 'pageurl' => string '' (length=0)
  6. 'addr' => string '192.168.18.73' (length=13)
  7. 'clientid' => string '334' (length=3)
  8. 'call' => string 'record_done' (length=11)
  9. 'recorder' => string '' (length=0)
  10. 'name' => string 'test123' (length=7)
  11. 'path' => string '/home/tinywan/video_recordings/test123-1491375411.flv' (length=53)

再次录像停止返回结果不同点

  1. 'path' => string '/home/tinywan/video_recordings/test123-1491375411.flv' (length=53)

RTMP直接录制成mp4格式:

  1. application live {
  2. allow play all;
  3. live on;
  4. record all;
  5. record_path /tmp/flv;
  6. record_unique on;
  7.  
  8. 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”。

  1. record_suffix _recorded.flv;

记录后缀可以是strftime格式的格式。以下指令

  1. 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

如果打开,将当前时间戳附加到录制文件。否则,每次新录制发生时,重写相同的文件。默认关闭。

  1. 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

切换文件追加模式。打开录像机后,将新数据附加到旧文件,或者在缺少时创建它。旧数据与文件中的新数据之间没有时间差距。默认关闭。

  1. record_append on;

record_lock

语法:record_lock on|off
context:rtmp,server,application,recorder

当打开当前录制的文件被锁定fcntl。可以从别处检查,以查明正在记录哪个文件。默认关闭。

  1. record_lock on;

在FreeBSD上,您可以使用flock工具来检查。在Linux flockfcntl 是无关紧要的,所以你要写一个简单的脚本检查文件锁定状态。这是一个这样的脚本的例子isunlocked.py

  1. #!/usr/bin/python
  2.  
  3. import fcntl, sys
  4.  
  5. sys.stderr.close()
  6. fcntl.lockf(open(sys.argv[], "a"), fcntl.LOCK_EX|fcntl.LOCK_NB)

record_max_size

语法:record_max_size size
context:rtmp,server,application,recorder

设置最大记录文件大小。

  1. record_max_size 128K;

record_max_frames

语法:record_max_frames nframes
context:rtmp,server,application,recorder

设置每个录制文件的最大视频帧数。

  1. record_max_frames ;

record_interval

语法:record_interval time
context:rtmp,server,application,recorder

重新启动录音后这个数(毫秒)秒。默认关闭。零表示录音之间没有延迟。如果record_unique关闭,则所有记录片段都将写入同一个文件。否则附加时间戳,使文件不同(给定record_interval超过1秒)。

  1. record_interval 1s;
  2.  
  3. record_interval 15m;

timeout

syntax: timeout value
context: rtmp, server

套接字超时 该值主要用于写入。大多数时间RTMP模块不会期望除发布商套接字之外的所有套接字上都有任何活动。如果想要断开套接字来快速断开连接,请使用活动工具,如keepalive或RTMP ping。默认为1分钟。

  1. timeout 60s;

ping

syntax: ping value
context: rtmp, server

RTMP ping间隔。零点关闭。RTMP ping是用于主动连接检查的协议功能。一个特殊的数据包被发送到远程对等体,并且在ping_timeout指令指定的超时期间预期回复。如果在这段时间内没有收到ping回复,则连接被关闭。ping的默认值为1分钟。默认ping超时为30秒。

  1. ping 3m;
  2. ping_timeout 30s;

max_streams

语法:max_streams value

背景:RTMP,服务器

设置RTMP流的最大数量。 数据流被复用到单个数据流中。 不同的通道用于发送命令,音频,视频等。默认值为32,这在许多情况下通常是确定的。

  1. max_streams ;

ack_window

设置RTMP确认窗口大小。 它是接收的字节数,在该字节之后,对等体应向远端发送确认分组。 默认值为5000000。

  1. ack_window ;

chunk_size

syntax: chunk_size value
context: rtmp, server

流复用的最大块大小。 默认值为4096.该值越大,CPU开销越低。 此值不能小于128。

  1. chunk_size ;

ack_window

syntax: ack_window value
context: rtmp, server

设置RTMP确认窗口大小。这是接收到的字节数,在此之后,对等体应该向远端发送确认数据包。默认值为5000000。

  1. ack_window ;

chunk_size

语法:chunk_size value
context:rtmp,server

流多路复用的最大块大小。默认值为4096.这个值越大,CPU开销越低。该值不能小于128。

  1. chunk_size ;

max_queue

max_message

语法:max_queue value
context:rtmp,server

输入数据消息的最大大小。所有输入数据都分为消息(还有更多的块)。等待它完成时,部分消息保存在内存中。在理论上,传入的消息可能非常大,这可能是服务器稳定性的一个问题。默认值1M对于很多情况都是足够的。

  1. max_message 1M;

buflen

语法:buflen time
context:rtmp,server

设置默认缓冲区长度。通常客户端set_buflen在播放之前发送RTMP 命令,并重置此设置。默认是1000 ms

  1. 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;

$name   推流名称  (mystream
$path   记录文件路径   (/tmp/rec/mystream-1389499351.flv)
$filename     省略目录的路径  (mystream-1389499351.flv)
$basename   扩展名省略的文件名  (mystream-1389499351)
$dirname   目录路径   (/tmp/rec)

基本视频信息获取实际案例记录

【1】获取视频文件大小:
  1. FILESIZE=`stat -c "%s"basename.mp4`
  2. 等同于:FILESIZE=`stat --format "%s"basename.mp4`
 
【2】获取视频录制时间:
  1. ffmpeg -i 4001481608583-1481696526.flv 2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
 
【3】自动截取封面图片
  1. ffmpeg -y -ss 00:00:10 -i $fullname -vframes 1 $VIDEO_PATH/$basename.jpg

【4】转码成MP4

  1. 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基础知识之————RTMP模块专题(实践文档)的更多相关文章

  1. Nginx基础知识之————RTMP模块中的中HLS专题(翻译文档)

    一.在Nginx配置文件的RTMP模块中配置hls hls_key_path /tmp/hlskeys; 提示错误信息: nginx: [emerg] the same path name " ...

  2. Nginx基础知识之————多模块(非覆盖安装、RTMP在线人数实例安装测试)

    说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体:这里以安装第三方nginx-rtmp-module和nginx-accesskey-2.0.3模块为例,nginx的 ...

  3. 【推荐】Nginx基础知识之————多模块(非覆盖安装、RTMP在线人数实例安装测试)

    说明:已经安装好的nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 具体:这里以安装第三方nginx-rtmp-module和nginx-accesskey-2.0.3模块为例,nginx的 ...

  4. day63:Linux:nginx基础知识&nginx基础模块

    目录 1.nginx基础知识 1.1 什么是nginx 1.2 nginx应用场景 1.3 nginx组成结构 1.4 nginx安装部署 1.5 nginx目录结构 1.6 nginx配置文件 1. ...

  5. Nginx基础知识介绍

    Nginx基础知识介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Nginx概述 Nginx是免费的.开源的.高性能的HTTP和正向/反向代理服务器.邮件代理服务器.以及T ...

  6. (转载)学校搭建使用nginx同时编译rtmp-module进行直播的技术文档

    原文地址:学校搭建使用 nginx 同时编译 rtmp-module 进行直播的技术文档 转载自我的大佬同学 MetalkgLZH.学校有几次需要全校观看网络直播的情况,但是学校的带宽不允许所有的班一 ...

  7. 《MATLAB从入门到放弃》二维曲线和图形绘制基础(二):使用Help文档学习line、plot、plotyy、subplot、hold绘图函数

    目录: »  plot 最常用的二维曲线绘图函数 >  帮助文档 >  基本使用语法 >  线条的样式.符号和颜色调整 >  图形属性调整 >  使用图形句柄进行设置 » ...

  8. Nginx学习之配置RTMP模块搭建推流服务

    写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...

  9. 1.21 Python基础知识 - python常用模块-2

    一.xml 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 X ...

随机推荐

  1. LeetCode:Two Sum II

    public class Solution { public int[] twoSum(int[] numbers, int target) { int left = 0; int right = n ...

  2. jQuery 菜单

  3. C# Linq 交集、并集、差集、去重

    using System.Linq;         List<string> ListA = new List<string>(); List<string> L ...

  4. react.js语法为了更好的兼容可以选以下这种方法配置即可

    首先下一个sublime text3 的编辑器: 支持大家使用正版,不过我是为了方便才所以这版本而已... 地址: http://sublimetext.iaixue.com/forum.php?mo ...

  5. 【001:go语言的一些语法基础】

    1. 循环语句 Go只有for一个循环语句关键字,但支持3种形式 初始化和步进表达式可以是多个值 条件语句每次循环都会被重新检查,因此不建议在条件语句中 使用函数,尽量提前计算好条件并以变量或常量代替 ...

  6. select in 在postgresql的效率问题

    在知乎上看到这样一个问题: MySQL 查询 select * from table where id in (几百或几千个 id) 如何提高效率?修改 电商网站,一个商品属性表,几十万条记录,80M ...

  7. Android USB Host与HID通讯

    前端时间捣鼓一个HID的硬件, 需要和android通信, 网上搜索了一圈,收获不小. 比较好的文章是:      Android USB Host与HID通讯 Android Service创建US ...

  8. 实现一个自适应网页用到的css知识

    1 div导致父级高度没有变化是应该子元素设置了float:left等 2 div元素居中 text-align:center; margin-left: auto;margin-right: 3 大 ...

  9. Supervisor重新加载配置

    Supervisor重新加载配置启动新的进程 liaojie 发布于 1年前,共有 0 条评论 一.添加好配置文件后 二.更新新的配置到supervisord supervisorctl update ...

  10. 数据分析 - 斯特鲁普效应(Stroop effect)

    数据分析 - 斯特鲁普效应(Stroop effect) Reinhard得到了一份斯特鲁普效应试验的数据,我们来分析下,文字的颜色,是否会影响受试者的反应. 这里先看看什么是斯特鲁普效应: 斯特鲁普 ...