源码地址: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重定向到另一个应用程序,其名称取自LocationHTTP响应头。否则,连接被丢弃。

注意:这个指令不应用范围允许的,因为应用还处于连接阶段不明。

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 flockfcntl 是无关紧要的,所以你要写一个简单的脚本检查文件锁定状态。这是一个这样的脚本的例子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;

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

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

【1】获取视频文件大小:
FILESIZE=`stat -c "%s"basename.mp4`
等同于:FILESIZE=`stat --format "%s"basename.mp4`
 
【2】获取视频录制时间:
ffmpeg -i 4001481608583-1481696526.flv  2>&1 | awk '/Duration/ {split($2,a,":");print a[1]*3600+a[2]*60+a[3]}'
 
【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 命令详解的更多相关文章

  1. 官方文档Core Technologies - Part 1

    首先介绍系列文章内容及Spring Framework官方文档情况. 在这一系列学习中,我阅读的主要资源是5.1.2 Reference Doc.,以及论坛大神的讲解blog.另外,Spring官方也 ...

  2. python附录-re.py模块源码(含re官方文档链接)

    re模块 python官方文档链接:https://docs.python.org/zh-cn/3/library/re.html re模块源码 r"""Support ...

  3. python附录-builtins.py模块str类源码(含str官方文档链接)

    python附录-builtins.py模块str类源码 str官方文档链接:https://docs.python.org/3/library/stdtypes.html#text-sequence ...

  4. 第0001题 : 产生随机数(顺便读random模块官方文档)

    看这个之前我准备先看一下random模块的官方文档... 在整个随机模块中,  最基础的就是random, 它产生一个 [0.0, 1.0)的浮点数. 这个模块下所有的函数实际上是绑定在一个叫做ran ...

  5. python-schedule模块(定时任务)基于官方文档总结

    一.模块安装 pip3 install schedule 官方文档 二.常用的使用案例 #基本格式 #创建方法 def func(): print("方法") #创建定时 sche ...

  6. 【翻译】Django Channels 官方文档 -- Tutorial

    Django Channels 官方文档 https://channels.readthedocs.io/en/latest/index.html 前言: 最近课程设计需要用到 WebSocket,而 ...

  7. Spring 4 官方文档学习(十一)Web MVC 框架之配置Spring MVC

    内容列表: 启用MVC Java config 或 MVC XML namespace 修改已提供的配置 类型转换和格式化 校验 拦截器 内容协商 View Controllers View Reso ...

  8. 实时监控、直播流、流媒体、视频网站开发方案流媒体服务器搭建及配置详解:使用nginx搭建rtmp直播、rtmp点播、,hls直播服务配置详解

    注意:这里不会讲到nginx流媒体模块如何安装的问题,只研究rtmp,hls直播和录制相关的nginx服务器配置文件的详细用法和说明.可以对照这些命令详解配置nginx -rtmp服务 一.nginx ...

  9. CentOS7.3利用kubeadm安装kubernetes1.7.3完整版(官方文档填坑篇)

    安装前记: 近来容器对企业来说已经不是什么陌生的概念,Kubernetes作为Google开源的容器运行平台,受到了大家的热捧.搭建一套完整的kubernetes平台,也成为试用这套平台必须迈过的坎儿 ...

随机推荐

  1. CSS技巧收集——毛玻璃效果

    先上 demo和 源码 其实毛玻璃的模糊效果技术上比较简单,只是用到了 css 滤镜(filter)中的 blur 属性.但是要做一个好的毛玻璃效果,需要注意很多细节. 比如我们需要将上图中页面中间的 ...

  2. docker之镜像管理命令

    一.docker image 镜像管理命令 指令 描述ls 列出本机镜像build 构建镜像来自Dockerfilehistory 查看镜像历史inspect 显示一个或多个镜像详细信息pull 从镜 ...

  3. Win7 64位操作系统连接HP 1010打印机完美解决方案

    工作的第一天就遇到问题,新电脑无法连接老式的HP1010打印机,64位Windows7系统无法连接32位XP网络共享打印机,而32位WIN7就可以. 这里分享个简单的解决方法:        先去下载 ...

  4. 一款基于Zigbee技术的智慧鱼塘系统研究与设计

    在现代鱼塘养鱼中,主要困扰渔农的就是养殖成本问题.而鱼塘养殖成本最高的就是养殖的人工费,喂养的饲料费和鱼塘中高达几千瓦增氧机的消耗的电费.实现鱼塘自动化养殖将会很好地解决上述问题,大大提高渔农的经济效 ...

  5. First day for introducing me

    """ This is first python3 script code for lyp in Bokeyuan __author__="lyp" ...

  6. LintCode——全排列

    描述:给定一个数字列表,返回其所有可能的排列. 样例:给出一个列表[1,2,3],其全排列为:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 说明: ...

  7. PAT甲题题解-1053. Path of Equal Weight (30)-dfs

    由于最后输出的路径排序是降序输出,相当于dfs的时候应该先遍历w最大的子节点. 链式前向星的遍历是从最后add的子节点开始,最后添加的应该是w最大的子节点, 因此建树的时候先对child按w从小到大排 ...

  8. 2-Eighteenth Scrum Meeting-20151218

    任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码 和服务器老师交流讨论区后台接口 史烨轩 获取视频url  尝试使用 ...

  9. Linux内核分析——第一周学习笔记

    20135313吴子怡.北京电子科技学院 chapter 1 知识点梳理 第一节 存储程序计算机工作模型 1.冯诺依曼体系结构:即具有存储程序的计算机体系结构.目前大多数拥有计算和存储功能的设备(智能 ...

  10. sql 更新多条记录

    转载:https://www.cnblogs.com/hfultrastrong/p/6905057.html 如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向 ...