zoukankan      html  css  js  c++  java
  • Nginx视频流模块nginx-rtmp-module

    文章参考地址:https://www.cnblogs.com/tinywan/p/6202345.html

    nginx-rtmp-module:https://github.com/arut/nginx-rtmp-module

    源码地址: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 1935;
    }

    application

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

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

    server {
        listen 1935;
        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-20170406093012.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_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[1], "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 2;

    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 32;

    ack_window

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

    ack_window 5000000;

    chunk_size

    syntax: chunk_size value
    context: rtmp, server

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

    chunk_size 4096;

     

    ack_window

    syntax: ack_window value
    context: rtmp, server

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

    ack_window 5000000;

    chunk_size

    语法:chunk_size value
    context:rtmp,server

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

    chunk_size 4096;

    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  

    path  

    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

  • 相关阅读:
    LeetCode 769. Max Chunks To Make Sorted
    LeetCode 845. Longest Mountain in Array
    LeetCode 1059. All Paths from Source Lead to Destination
    1129. Shortest Path with Alternating Colors
    LeetCode 785. Is Graph Bipartite?
    LeetCode 802. Find Eventual Safe States
    LeetCode 1043. Partition Array for Maximum Sum
    LeetCode 841. Keys and Rooms
    LeetCode 1061. Lexicographically Smallest Equivalent String
    LeetCode 1102. Path With Maximum Minimum Value
  • 原文地址:https://www.cnblogs.com/boonya/p/8022117.html
Copyright © 2011-2022 走看看