zoukankan      html  css  js  c++  java
  • 基于nginx的rtmp直播服务器(nginx-rtmp-module实现)

    首先,在搭建服务之前先了解下目前主流的几个直播协议:

    1、RTMP:

         实时消息传输协议,Real Time Messaging Protocol,是 Adobe Systems 公司为 Flash 播放器和服务器之间音频、视频和数据传输开发的开放协议。协议基于 TCP,是一个协议族,包括 RTMP 基本协议及 RTMPT/RTMPS/RTMPE 等多种变种。RTMP 是一种设计用来进行实时数据通信的网络协议,主要用来在 Flash/AIR 平台和支持RTMP协议的流媒体/交互服务器之间进行音视频和数据通信。这种方式的实时性比较强,基本能保证延迟在1-2s内,是现在国内直播主要采用的方式之一;不过使用这种协议,就必须安装flash,而H5、IOS、Android并不能原生支持flash,因此这种协议能流行多久,就不得而知了,毕竟移动端才是现在的主流。

    2、HLS:

         hls是Apple推出的直播协议,是通过视频流切片成文件片段来直播的。客户端首先会请求一个m3u8文件,里面会有不同码率的流,或者直接是ts文件列表,通过给出的ts文件地址去依次播放。在直播的时候,客户端会不断请求m3u8文件,检查ts列表是否有新的ts切片。这种方式的实时性较差,不过优势是H5、IOS、Android都原生支持。

    3、HTTP-FLV:

          HTTP-FLV就是对RTMP协议的封装,相比于RTMP,它是一个开放的协议。因此他具备了RTMP的实时性和RTMP不具备的开发性,而且随着flv.js出现(感谢B站),使得浏览器在不依赖flash的情况下,播放flv视频,从而兼容了移动端,所以现在很多直播平台,尤其是手机直播平台,都会选择它

    一、安装加载nginx-rtmp-module模块的nginx

    1、到nginx.org 下载稳定版本的nginx

     2、到 https://github.com/arut/nginx-rtmp-module 下载rtmp模块(git clone https://github.com/arut/nginx-rtmp-module.git)

    解压nginx的tar包;nginx 和trmp模块在同一目录

    nginx-1.12.2  nginx-1.12.2.tar.gz  nginx-rtmp-module

    3、到nginx解压目录配置编译参数

    ./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module.1.1.4 --with-http_ssl_module 

    4、make && make install 安装

    如果已安装nginx可以在已有nginx上面增加模块:参考https://www.cnblogs.com/zhangmingda/p/12622590.html

    二、配置nginx rtmp直播功能nginx.conf

    # For more information on configuration, see:
    #   * Official English Documentation: http://nginx.org/en/docs/
    #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on; #内核直接发送文件到客户端
        tcp_nopush          on; #够一定数据量再发送
        tcp_nodelay         on; #同上
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        # Load modular configuration files from the /etc/nginx/conf.d directory.
        # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80 default_server;
    #        listen       [::]:80 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
            location / {
                resolver 8.8.8.8;
                #proxy_pass $scheme://$http_host$request_uri;
                proxy_buffers   256 4k;                         
                proxy_max_temp_file_size 0k; 
            }
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    
    # Settings for a TLS enabled server.
    #
        server {
            listen       443 ssl http2 default_server;
            listen       [::]:443 ssl http2 default_server;
            server_name  _;
            root         /usr/share/nginx/html;
    
            ssl_certificate "/etc/pki/nginx/server.crt";
            ssl_certificate_key "/etc/pki/nginx/private/server.key";
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            ssl_ciphers HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;
    
            # Load configuration files for the default server block.
            include /etc/nginx/default.d/*.conf;
    
            location / {
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
        server {
        listen 8080;
            #配置RTMP状态一览HTTP页面=========================================
            location /stat {
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
            }
            location /stat.xsl {
                root /opt/rtmp/nginx-rtmp-module/;
            }
            #配置RTMP状态一览界面结束==========================
         
         #HTTP协议访问直播流文件配置 location /hls { #添加视频流存放地址。 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } #访问权限开启,否则访问这个地址会报403 autoindex on; alias /usr/share/nginx/html/hls;#视频流存放地址,与下面的hls_path相对应,这里root和alias的区别可自行百度 expires -1; add_header Cache-Control no-cache; #防止跨域问题 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; } }
    } #点播/直播功能实现配置rtmp协议 rtmp { server { listen 1935; chunk_size 4000; application vod { play /usr/share/nginx/html/vod/flvs/;#点播媒体存放目录 } application live { live on; }
          #HLS直播配置 application hls { live on; hls on; hls_path /usr/share/nginx/html/hls;#视频流存放地址 hls_fragment 5s; hls_playlist_length 15s; hls_continuous on; #连续模式。 hls_cleanup on; #对多余的切片进行删除。 hls_nested on; #嵌套模式。 } } }

    1、点播

      1.1 mkdir /usr/share/nginx/html/vod/flvs/;#创建点播媒体存放目录,并存放test.flv 视频文件
      1.2 自己写html页面访问点播资源
        html页面嵌入wplayer播放器。播放器播放rtmp://....资源
        wplayer下载:http://d2.11684.com/jwplayer-c-11684.com.rar
        jwplayer解压后放到html文件的同级别目录下
    #ls /usr/share/nginx/html/
     dianbo-test.html  jwplayer    
    目录示例
     1 <html>
     2          <head>
     3          welcome test rtmp <br>
     4                    <script src="/jwplayer/jwplayer.js"></script>
     5          </head>
     6          <body>
     7          <script type="text/javascript">
     8                             jwplayer.key="gq5NkJHPa+/FmgFfssKaHtp4gbzJJzcRhES+H9Cs4w8=";
     9                    </script>
    10                    <div id='my-video'></div>
    11                    <script type='text/javascript'>
    12                             jwplayer('my-video').setup({
    13                                      file:'rtmp://120.92.91.16/vod/test.flv',   
    14                                      '50%',
    15                                      aspectratio:'3:2',
    16                                      fallback:'false',
    17                                      primary:'flash' 
    18                                      });
    19                    </script>
    20                    <script type="text/javascript">
    21                             jwplayer.key="gq5NkJHPa+/FmgFfssKaHtp4gbzJJzcRhES+H9Cs4w8=";
    22                    </script>
    23          </body>
    24 </html>
    html+wplayer播放器播放流媒体:dianbo-test.html 

        IE浏览器输入http://ip/dianbo-test.html播放

        #注意:实测只支持IE浏览器

        1.3 使用专用的播放器:

          windows:VLC media player 播放按钮可以输入rtmp://的连接,步骤为:播放-->播放-->网络媒体

          安卓:手机万能播放器:我的-->连接播放-->输入url即可播放

            

     2、直播

      推流:

        电脑端OBS 可以输入推流地址rtmp://IP/live/test 进行推流,其中live 为配置文件中定义的直播应用,test为自定义流名称

        

      rtmp拉流:url与点播的有区别:

    <html>
             <head>
             welcom to test rtml <br>
                       <script src="/jwplayer/jwplayer.js"></script>
             </head>
             <body>
             <script type="text/javascript">
                                jwplayer.key="gq5NkJHPa+/FmgFfssKaHtp4gbzJJzcRhES+H9Cs4w8=";
                       </script>
                       <div id='my-video'></div>
                       <script type='text/javascript'>
                                jwplayer('my-video').setup({
                                   file:'rtmp://120.92.91.16/live/test',
                                         '50%',
                                         aspectratio:'3:2',
                                         fallback:'false',
                                         primary:'flash' 
                                         });
                       </script>
                       <script type="text/javascript">
                                jwplayer.key="gq5NkJHPa+/FmgFfssKaHtp4gbzJJzcRhES+H9Cs4w8=";
                       </script>
             </body>
    </html>
    jwplayer.js播放rtmp协议直播视频

      HLS 协议推流:推流一样使用rtmp://IP/应用名/流名称 进行推流

      HLS协议拉流:支持http协议访问hls应用下流名称.m3u8文件

      

    <html>
             <head>
             welcome test nginx-rtmp-module  <br>
             </head>
             <body>
    
    <video>  
        <source src="http://120.92.91.16/hls/test/index.m3u8"/>  
    </video>
             </body>
    </html> 

      点播:直播录制的flv视频html

      前端使用B站的flv.min.js

    <!DOCTYPE html>
    <html>
    
    <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>flv.js demo</title>
        <style>
            .mainContainer {
        display: block;
        width: 1024px;
        margin-left: auto;
        margin-right: auto;
    }
    
    .urlInput {
        display: block;
        width: 100%;
        margin-left: auto;
        margin-right: auto;
        margin-top: 8px;
        margin-bottom: 8px;
    }
    
    .centeredVideo {
        display: block;
        width: 100%;
        height: 576px;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: auto;
    }
    
    .controls {
        display: block;
        width: 100%;
        text-align: left;
        margin-left: auto;
        margin-right: auto;
    }
        </style>
    </head>
    
    <body>
        <div class="mainContainer">
            <video id="videoElement" class="centeredVideo" controls autoplay width="1024" height="576">Your browser is too old which doesn't support HTML5 video.</video>
        </div>
        <br>
        <div>
            <input style="500px" type="text" placeholder="请输入flv链接" id="flvUrl" />
            <button onclick="load_flv()">加载</button>
        </div>
        <br>
        <div class="controls">
            <button onclick="flv_start()">开始</button>
            <button onclick="flv_pause()">暂停</button>
            <button onclick="flv_destroy()">停止</button>
            <input style="100px" type="text" name="seekpoint" />
            <button onclick="flv_seekto()">跳转</button>
        </div>
        <script src="flv.min.js"></script>
        <script>
            var player = document.getElementById('videoElement');
    
            function load_flv() {
                var flvurl = document.getElementById('flvUrl').value;
                console.log(flvurl);
                if (flvjs.isSupported()) {
                    var flvPlayer = flvjs.createPlayer({
                        type: 'flv',
                        url: flvurl
                    });
                    flvPlayer.attachMediaElement(videoElement);
                    flvPlayer.load(); //加载
                }
            }
    
            function flv_start() {
                player.play();
            }
    
            function flv_pause() {
                player.pause();
            }
    
            function flv_destroy() {
                player.pause();
                player.unload();
                player.detachMediaElement();
                player.destroy();
                player = null;
            }
    
            function flv_seekto() {
                player.currentTime = parseFloat(document.getElementsByName('seekpoint')[0].value);
            }
        </script>
    </body>
    
    </html>
    flv-player.html

    ===========了解下nginx-rtmp-module模块的配置文件=======================

    rtmp
    语法:rtmp { ... }
    上下文:根
    描述:保存所有 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]
    上下文:server
    描述:给 NGINX 添加一个监听端口以接收 RTMP 连接。
    server {
        listen 1935;
    }
    application
    语法:application name { ... }
    上下文:server
    描述:创建一个 RTMP 应用。application 名的模式并不类似于 http location。
    server {
        listen 1935;
        application myapp {
        }
    }
    timeout
    语法:timeout value
    上下文:rtmp, server
    描述:Socket 超时。这个值主要用于写数据时。大多数情况下,RTMP 模块并不期望除 publisher 端口之外的其他端口处于活动状态。如果你想要快速关掉 socket 可以用 keepalive 或者 RTMP ping 等。timeout 默认值为 1 分钟。
    timeout 60s;
    ping
    语法:ping value
    上下文:rtmp, server
    描述:RTMP ping 间隔。零值的话将 ping 关掉。RTMP ping 是一个用于检查活动连接的协议功能。发送一个特殊的包到远程连接,然后在 ping_timeout 指令指定的时间内期待一个回复。如果在这个时间里没有收到 ping 回复,连接断开。ping 默认值为一分钟。ping_timeout 默认值为 30 秒。
    ping 3m;
    ping_timeout 30s;
    ping_timeout
    语法:ping_timeout value
    上下文:rtmp, server
    描述:请参考上文 ping 描述。
    max_streams
    语法:max_streams value
    上下文:rtmp, server
    描述:设置 RTMP 流的最大数目。数据流被整合到一个单一的数据流里。不同的频道用于发送命令、音频、视频等。默认值为 32,适用于大多数情况。
    max_streams 32;
    ack_window
    语法:ack_window value
    上下文:rtmp, server
    描述:设置 RTMP 确认视窗大小。这是对端发送确认包到远端后应该收到的字节数量。默认值为 5000000。
    ack_window 5000000;
    chunk_size
    语法:chunk_size value
    上下文:rtmp, server
    描述:流整合的最大的块大小。默认值为 4096。这个值设置的越大 CPU 负载就越小。这个值不能低于 128。
    chunk_size 4096;
    max_queue
    语法:max_queue value
    上下文:rtmp, server
    描述:输入数据报文最大尺寸。所有输入数据会被分割成报文(然后进一步分割为块)。报文在处理结束之前会放在内存里。理论上讲,接收到的报文很大的话对于服务器的稳定性可能会有影响。默认值 1M 对于大多数情况就足够了。
    max_message 1M;
    out_queue
    out_cork
    Access
    allow
    语法:allow [play|publish] address|subnet|all
    上下文:rtmp, server, application
    允许来自指定地址或者所有地址发布/播放。allow 和 deny 指令的先后顺序可选。
    allow publish 127.0.0.1;
    deny publish all;
    allow play 192.168.0.0/24;
    deny play all;
    deny
    语法:deny [play|publish] address|subnet|all
    上下文:rtmp, server, application
    描述:参考 allow 的描述。
    Exec
    exec
    语法:exec command arg*
    上下文:rtmp, server, application
    描述:定义每个流发布时要执行的带有参数的外部命令。发布结束时进程终止。第一个参数应该是二进制可执行文件的完整路径。关于这个进程将会做些什么事没有任何假定。但这一特点在使用 ffmpeg 进行流转换时是很有用的。FFmpeg 被假定作为客户端连接到 nginx-rtmp 然后作为发布者输出转换流到 nginx-rtmp。类似于 $var/${var} 形式的替换可以在命令行使用:
    * $name - 流的名字。
    * $app - 应用名。
    * $addr - 客户端地址。
    * $flashver - 客户端 flash 版本。
    * $swfurl - 客户端 swf url。
    * $tcurl - 客户端 tc url。
    * $pageurl - 客户端页面 url。
    可以在 exec 指令中定义 Shell 格式的转向符用于写输出和接收输入。支持如下
    * 截断输出 >file。
    * 附加输出 >>file。
    * 重定向描述符类似于 1>&2。
    * 输入 <file。
    以下 ffmpeg 调用将输入流转码为 HLS-ready 流(H264/AAC)。运行这个示例,FFmpeg 须编译为支持 libx264 & libfaac。
    application src {
        live on;
        exec ffmpeg -i rtmp://localhost/src/$name -vcodec libx264 -vprofile baseline -g 10 -s 300x200 -acodec libfaac -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 15s;
    }
    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_kill_signal
    语法:exec_kill_signal signal
    上下文:rtmp, server, application
    描述:设置进程终止信号。默认为 kill(SIGKILL)。你可以定义为数字或者符号名(POSIX.1-1990 信号)。
    exec_kill_signal term;
    exec_kill_signal usr1;
    exec_kill_signal 3;
    respawn
    语法:respawn on|off
    上下文:rtmp, server, application
    描述:如果打开 respawn 子进程,进程终止时发布会仍然继续。默认为打开。
    respawn off;
    respawn_timeout
    语法:respawn_timeout timeout
    上下文:rtmp, server, application
    描述:启动新的子实例之前,设置 respawn 超时时间。默认为五秒。
    respawn_timeout 10s;
    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
    描述:指定播放结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同 exec_publish。
    exec_publish_done
    语法:exec_publish_done command arg*
    上下文:rtmp, server, application
    描述:指定发布结束事件触发的带有参数的外部命令。返回码是未解析的。替换列表同 exec_publish。
    exec_record_done
    语法:exec_record_done command arg*
    上下文:rtmp, server, application, recorder
    描述:指定录制结束时触发的带有参数的外部命令。这里支持 exec_publish 的替代以及额外的变量 path 和 recorder。
    # track client info
    exec_play bash -c "echo $addr $pageurl >> /tmp/clients";
    exec_publish bash -c "echo $addr $flashver >> /tmp/publishers";


    # convert recorded file to mp4 format
    exec_record_done ffmpeg -y -i $path -acodec libmp3lame -ar 44100 -ac 1 -vcodec libx264 $path.mp4;
    Live
    live
    语法:live on|off
    上下文:rtmp, server, application
    描述:切换直播模式,即一对多广播。
    live on;
    meta
    语法:meta on|off
    上下文:rtmp, server, application
    描述:切换发送元数据到客户端。默认为 on。
    meta off;
    interleave
    语法:interleave on|off
    上下文:rtmp, server, application
    描述:切换交叉模式。在这个模式下,音频和视频数据会在同一个 RTMP chunk 流中传输。默认为 off。
    interleave on;
    wait_key
    语法:wait_key on|off
    上下文:rtmp, server, application
    描述:使视频流从一个关键帧开始。默认为 off。
    wait_key on;
    wait_video
    语法:wait_video on|off
    上下文:rtmp, server, application
    描述:在第一个视频帧发送之前禁用音频。默认为 off。可以和 wait_key 进行组合以使客户端可以收到具有所有其他数据的视频关键帧。然而这通常增加连接延迟。您可以通过在编码器中调整关键帧间隔来减少延迟。
    wait_video on;
    publish_notify
    语法:publish_notify on|off
    上下文:rtmp, server, application
    描述:发送 NetStream.Publish.Start 和 NetStream.Publish.Stop 给用户。默认为 off。
    publish_notify on;
    drop_idle_publisher
    语法:drop_idle_publisher timeout
    上下文:rtmp, server, application
    描述:终止指定时间内闲置(没有音频/视频数据)的发布连接。默认为 off。注意这个仅仅对于发布模式的连接起作用(发送 publish 命令之后)。
    drop_idle_publisher 10s;
    sync
    语法:sync timeout
    上下文:rtmp, server, application
    描述:同步音频和视频流。如果用户带宽不足以接收发布率,服务器会丢弃一些帧。这将导致同步问题。当时间戳差超过 sync 指定的值,将会发送一个绝对帧来解决这个问题。默认为 300 ms。
    sync 10ms;
    play_restart
    语法:play_restart on|off
    上下文:rtmp, server, application
    描述:使 nginx-rtmp 能够在发布启动或停止时发送 NetStream.Play.Start 和 NetStream.Play.Stop 到每个用户。如果关闭的话,那么每个用户就只能在回放的开始和结束时收到这些通知了。默认为 on。
    play_restart off;
    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 man page 里进行查找。
    record_unique
    语法:record_unique on|off
    上下文:rtmp, server, application, recorder
    描述:是否添加时间戳到录制文件。否则的话同样的文件在每一次新的录制发生时将被重写。默认为 off。
    record_unique on;
    record_append
    语法:record_append on|off
    上下文:rtmp, server, application, recorder
    描述:切换文件附加模式。当这一指令为开启是,录制时将把新数据附加到老文件,如果老文件丢失的话将重新创建一个。文件中的老数据和新数据没有时间差。默认为 off。
    record_append on;
    record_lock
    语法:record_lock on|off
    上下文:rtmp, server, application, recorder
    描述:当这一指令开启时,当前录制文件将被 fcntl 调用锁定。那样可以在其他地方来核实哪个文件正在进行录制。默认为 off。
    record_lock on;
    在 FreeBSD 上你可以使用 flock 工具检查。在 Linux 上 flock 和 fcntl 无关,因此你需要去写一个简单的脚本来检查文件的锁定状态。以下 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
    上下文:rtmp, server, application, recorder
    描述:设置录制文件的最大值。
    record_max_size 128K;
    record_max_frames
    语法:record_max_frames nframes
    上下文:rtmp, server, application, recorder
    描述:设置每个录制文件的视频帧的最大数量。
    record_max_frames 2;
    record_interval
    语法:record_interval time
    上下文:rtmp, server, application, recorder
    描述:在这个指令指定数量的(毫秒)秒之后重启录制。默认为 off。设置为 0 的话意味着录制中无延迟。如果 record_unique 为 off 的话所有记录片段会被写到同一个文件。否则(文件名)将附以时间戳以区分不同文件(给定的record_interval 要大于 1 秒)。
    record_interval 1s;


    record_interval 15m;
    recorder
    语法:recorder name {...}
    上下文:application
    描述:创建录制块。可以在单个 application 中创建多个记录。上文提到的所有录制相关的指令都可以在 recorder{}块中进行定义。继承高层次中的所有设置。
    application {
        live on;


        # default 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;
        }
    }
    record_notify
    语法:record_notify on|off
    上下文:rtmp, server, application, recorder
    描述:切换当定义录制启动或停止文件时发送 NetStream.Record.Start 和 NetStream.Record.Stop 状态信息(onStatus)到发布者。状态描述字段保存录制的名字(默认录制的话为空)。默认为 off。
    recorder myrec {
        record all manual;
        record_path /var/rec;
        record_notify on;
    }
    VOD
    play
    语法:lay dir|http://loc [dir|http://loc]*
    上下文:rtmp, server, application
    描述:播放指定目录或者 HTTP 地址的 flv 或者 mp4 文件。如果此参数前缀是 http:// 那么就认为文件可以在播放前从远程 http 地址下载下来。注意播放是在整个文件下载完毕之后才开始。你可以使用本地 nginx 在本地机器缓存文件。
    同一个 play 指令可以定义多个播放地址。当多个 play 指令定义时,地址列表将被合并,并进行从更高域中继承。尝试播放每一个地址,直到发现一个成功的地址。如果没有找到成功地址,将发送错误状态到客户端。
    索引的 FLV 播放具有随机查找能力。没有索引的 FLV 则不具备查找/暂停能力(重播模式)。使用 FLV 索引器(比如 yamdi)来编索引。
    mp4 文件只有在音频和视频编码都被 RTMP 支持时才可以播放。最常见的情况是 H264/AAC。
    application vod {
        play /var/flvs;
    }


    application vod_http {
        play http://myserver.com/vod;
    }


    application vod_mirror {
        # try local location first, then access remote location
        play /var/local_mirror http://myserver.com/vod;
    }
    播放 /var/flvs/dir/file.flv:
    ffplay rtmp://localhost/vod/dir/file.flv
    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
    描述:设置远程 VOD 文件完全下载之后复制于 play_temp_path 之后的路径。空值的话禁用此功能。默认为控制。这个功能可以用于缓存远程文件在本地。
    这一路径应该和 play_temp_path 处于同一设备。
    # search file in /tmp/videos.
    # if not found play from remote location
    # and store in /tmp/videos


    play_local_path /tmp/videos;
    play /tmp/videos http://example.com/videos;
    Relay
    pull
    语法:pull url [key=value]*
    上下文:application
    描述:创建 pull 中继。流将从远程服务器上拉下来,成为本地可用的。仅当至少有一个播放器正在播放本地流时发生。
    Url 语法:[rtmp://]host[:port][/app[/playpath]]。如果 application 找不着那么将会使用本地 application 名。如果找不着 playpath 那么就是用当前流的名字。
    支持以下参数:
    * app - 明确 application 名。
    * name - 捆绑到 relay 的本地流名字。如果为空或者没有定义,那么将会使用 application 中的所有本地流。
    * tcUrl - 如果为空的话自动构建。
    * pageUrl - 模拟页面 url。
    * swfUrl - 模拟 swf url。
    * flashVer - 模拟 flash 版本,默认为 'LNX.11,1,102,55'。
    * playPath - 远程播放地址。
    * live - 切换直播特殊行为,值:0,1。
    * start - 开始时间。
    * stop - 结束时间。
    * static - 创建静态 pull,这样的 pull 在 nginx 启动时创建。
    如果某参数的值包含空格,那么你应该在整个 key=value 对周围使用引号,比如:'pageUrl=FAKE PAGE URL'。
    pull rtmp://cdn.example.com/main/ch?id=12563 name=channel_a;


    pull rtmp://cdn2.example.com/another/a?b=1&c=d pageUrl=http://www.example.com/video.html swfUrl=http://www.example.com/player.swf live=1;


    pull rtmp://cdn.example.com/main/ch?id=12563 name=channel_a static;
    push
    语法:push url [key=value]*
    上下文:application
    描述:push 的语法和 pull 一样。不同于 pull 指令的是 push 推送发布流到远程服务器。
    push_reconnect
    语法:push_reconnect time
    上下文:rtmp, server, application
    描述:在断开连接后,在 push 重新连接前等待的时间。默认为 3 秒。
    push_reconnect 1s;
    session_relay
    语法:session_relay on|off
    上下文:rtmp, server, application
    描述:切换会话 relay 模式。在这种模式下连接关闭时 relay 销毁。当设置为 off 时,流关闭,relay 销毁,这样子以后另一个 relay 可以被创建。默认为 off。
    session_relay on;
    Notify
    on_connect
    语法:on_connect url
    上下文:rtmp, server
    描述:设置 HTTP 连接回调。当客户分发连接命令一个连接命令时,一个 HTTP 请求异步发送,命令处理将被暂停,直到它返回结果代码。当 HTTP 2XX 码(成功状态码)返回时,RTMP 会话继续。返回码 3XX (重定向状态码)会使 RTMP 重定向到另一个从 HTTP 返回头里获取到的 application。否则(其他状态码)连接丢弃。
    注意这一指令在 application 域是不允许的,因为 application 在连接阶段还是未知的。
    HTTP 请求接收到一些参数。在 application/x-www-form-urlencoded MIME 类型下使用 POST 方法。以下参数将被传给调用者:
    * call=connect。
    * addr - 客户端 IP 地址。
    * app - application 名。
    * flashVer - 客户端 flash 版本。
    * swfUrl - 客户端 swf url。
    * tcUrl - tcUrl。
    * pageUrl - 客户端页面 url。
    除了上述参数以外,所有显式传递给连接命令的参数也由回调发送。你应该将连接参数和 play/publish 参数区分开。播放器常常有独特的方式设置连接字符串不同于 play/publish 流名字。这里是 JWPayer 是如何设置这些参数的一个示例:
    ...
    streamer: "rtmp://localhost/myapp?connarg1=a&connarg2=b",
    file: "mystream?strarg1=c&strarg2=d",
    ...
    Ffplay(带有 librtmp)示例:
    ffplay "rtmp://localhost app=myapp?connarg1=a&connarg2=b playpath=mystream?strarg1=c&strarg2=d"
    使用例子:
    on_connect http://example.com/my_auth;
    重定向例子:
    location /on_connect {
        if ($arg_flashver != "my_secret_flashver") {
            rewrite ^.*$ fallback? permanent;
        }
        return 200;
    }
    on_play
    语法:on_play url
    上下文:rtmp, server, application
    描述:设置 HTTP 播放回调。每次一个客户分发播放命令时,一个 HTTP 请求异步发送,命令处理会挂起 - 直到它返回结果码。之后再解析 HTTP 结果码。
    * HTTP 2XX 返回码的话继续 RTMP 会话。
    * HTTP 3XX 返回码的话 重定向 RTMP 到另一个流,这个流的名字在 HTTP 返回头的 Location 获取。如果新流的名字起始于 rtmp:// 然后远程 relay 会被创建。relay 要求 IP 地址是指定的而不是域名,并且只工作在 1.3.10 版本以上的 nginx。另请参考 notify_relay_redirect。
    * 其他返回码的话 RTMP 连接丢弃。
    重定向例子:
    http {
        ...
        location /local_redirect {
            rewrite ^.*$ newname? permanent;
        }
        location /remote_redirect {
            # no domain name here, only ip
            rewrite ^.*$ rtmp://192.168.1.123/someapp/somename? permanent;
        }
        ...
    }


    rtmp {
        ...
        application myapp1 {
            live on;
            # stream will be redirected to 'newname'
            on_play http://localhost:8080/local_redirect;
        }
        application myapp2 {
            live on;
            # stream will be pulled from remote location
            # requires nginx >= 1.3.10
            on_play http://localhost:8080/remote_redirect;
        }
        ...
    }
    HTTP 请求接收到一些个参数。在 application/x-www-form-urlencoded MIME 类型下使用 POST 方法。以下参数会被传送给调用者:
    * call=play。
    * addr - 客户端 IP 地址。
    * app - application 名。
    * flashVer - 客户端 flash 版本。
    * swfUrl - 客户端 swf url。
    * tcUrl - tcUrl。
    * pageUrl - 客户端页面 url。
    * name - 流名。
    出了上述参数之外其他所有播放命令参数显式地发送回调。例如如果一个流由 url rtmp://localhost/app/movie?a=100&b=face&foo=bar 访问,然后呢 a,b 和 foo 发送回调。
    on_play http://example.com/my_callback;
    on_publish
    语法:on_publish url
    上下文:rtmp, server, application
    描述:同上面提到的 on_play 一样,唯一的不同点在于这个指令在发布命令设置回调。不同于远程 pull,push 在这里是可以的。
    on_done
    语法:on_done url
    上下文:rtmp, server, application
    描述:设置播放/发布禁止回调。上述所有适用于此。但这个回调并不检查 HTTP 状态码。
    on_play_done
    语法:on_publish_done url
    上下文:rtmp, server, application
    描述:等同于 on_done 的表现,但只适用于播放结束事件。
    on_publish_done
    语法:on_publish_done url
    上下文:rtmp, server, application
    描述:等同于 on_done 的表现,但只适用于发布结束事件。
    on_record_done
    语法:on_record_done url
    上下文:rtmp, server, application, recorder
    描述:设置 record_done 回调。除了普通 HTTP 回调参数它接受录制文件路径。
    on_record_done http://example.com/recorded;
    on_update
    语法:on_update url
    上下文:rtmp, server, application
    描述:设置 update 回调。这个回调会在 notify_update_timeout 期间调用。如果一个请求返回结果不是 2XX,连接禁止。这可以用来同步过期的会话。追加 time 参数即播放/发布调用后的秒数会被发送给处理程序。
    on_update http://example.com/update;
    notify_update_timeout
    语法:notify_update_timeout timeout
    上下文:rtmp, server, application
    描述:在 on_update 回调之间的超时设置。默认为 30 秒。
    notify_update_timeout 10s;
    on_update http://example.com/update;
    notify_update_strict
    语法:notify_update_strict on|off
    上下文:rtmp, server, application
    描述:切换 on_update 回调严格模式。默认为 off。当设置为 on 时,所有连接错误,超时以及 HTTP 解析错误和空返回会被视为更新失败并导致连接终止。当设置为 off 时只有 HTTP 返回码不同于 2XX 时导致失败。
    notify_update_strict on;
    on_update http://example.com/update;
    notify_relay_redirect
    语法:notify_relay_redirect on|off
    上下文:rtmp, server, application
    描述:使本地流可以重定向为 on_play 和 on_publish 远程重定向。新的流名字是 RTMP URL 用于远程重定向。默认为 off。
    notify_relay_redirect on;
    notify_method
    语法:notify_method get|post
    上下文:rtmp, server, application, recorder
    描述:设置 HTTP 方法通知。默认是带有 application/x-www-form-urlencoded 的 POST 内容类型。在一些情况下 GET 更好,例如如果你打算在 nginx 的 http{} 部分处理调用。在这种情况下你可以使用 arg_* 变量去访问参数。
    notify_method get;
    在 http{} 部分使用 GET 方法处理通知可以使用这种方法:
    location /on_play {
        if ($arg_pageUrl ~* localhost) {
            return 200;
        }
        return 500;
    }
    HLS
    hls
    语法:hls on|off
    上下文:rtmp, server, application
    描述:在 application 切换 HLS。
    hls on;
    hls_path /tmp/hls;
    hls_fragment 15s;
    在 http{} 段为客户端播放 HLS 设置在以下位置设置:
    http {
        ...
        server {
            ...
            location /hls {
                types {
                    application/vnd.apple.mpegurl m3u8;
                }
                alias /tmp/hls;
            }
        }
    }
    hls_path
    语法:hls_path path
    上下文:rtmp, server, application
    描述:设置 HLS 播放列表和分段目录。这一目录必须在 NGINX 启动前就已存在。
    hls_fragment
    语法:hls_fragment time
    上下文:rtmp, server, application
    描述:设置 HLS 分段长度。默认为 5 秒钟。
    hls_playlist_length
    语法:hls_playlist_length time
    上下文:rtmp, server, application
    描述:设置 HLS 播放列表长度。默认为 30 秒钟。
    hls_playlist_length 10m;
    hls_sync
    语法:hls_sync time
    上下文:rtmp, server, application
    描述:设置 HLS 时间戳同步阈值。默认为 2 ms。这一功能可以防止由低分辨率 RTMP (1KHz) 转换到高分辨率 MPEG-TS (90KHz) 之后出现噪音。
    hls_sync 100ms;
    hls_continuous
    语法:hls_continuous on|off
    上下文:rtmp, server, application
    描述:切换 HLS 连续模式。这一模式下 HLS 序列号由其上次停止的最后时间开始。老的分段保留下来。默认为 off。
    hls_continuous on;
    hls_nested
    语法:hls_nested on|off
    上下文:rtmp, server, application
    描述:切换 HLS 嵌套模式。这一模式下为每个流创建了一个 hls_path 的子目录。播放列表和分段在那个子目录中创建。默认为 off。
    hls_nested on;
    hls_cleanup
    语法:hls_cleanup on|off
    上下文:rtmp, server, application
    描述:切换 HLS 清理。这一功能默认为开启的。在这一模式下 nginx 缓存管理进程将老的 HLS 片段和播放列表由 HLS 清理掉。
    hls_cleanup off;
    Access log
    access_log
    语法:access_log off|path [format_name]
    上下文:rtmp, server, application
    描述:设置访问日志参数。日志默认是开启的。关闭日志可以使用 access_log off 指令。默认情况下访问日志和 HTTP 访问日志 logs/access.log 放到同一文件。你也可以使用 access_log 指令将其定义到其他日志文件。第二个参数是可选的。可以根据名字来定义日志格式。请参考 log_format 指令来获取更多关于格式的详细信息。
    log_format new '$remote_addr';
    access_log logs/rtmp_access.log new;
    access_log logs/rtmp_access.log;
    access_log off;
    log_format
    语法:log_format format_name format
    上下文:rtmp
    描述:创建指定的日志格式。日志格式看起来很像 nginx HTTP 日志格式。日志格式里支持的几个变量有:
    * connection - 连接数。
    * remote_addr - 客户端地址。
    * app - application 名。
    * name - 上一个流名。
    * args - 上一个流播放/发布参数。
    * flashver - 客户端 flash 版本。
    * swfurl - 客户端 swf url。
    * tcurl - 客户端 tcUrl。
    * pageurl - 客户端页面 url。
    * command - 客户端发送的播放/发布命令:NONE、PLAY、PUBLISH、PLAY+PUBLISH。
    * bytes_sent - 发送到客户端的字节数。
    * bytes_received - 从客户端接收到的字节数。
    * time_local - 客户端连接结束的本地时间。
    * session_time - 持续连接的秒数。
    * session_readable_time - 在可读格式下的持续时间。
    默认的日志格式叫做 combined。这里是这一格式的定义:
    $remote_addr [$time_local] $command "$app" "$name" "$args" - 
    $bytes_received $bytes_sent "$pageurl" "$flashver" ($session_readable_time)
    Limits
    max_connections
    语法:max_connections number
    上下文:rtmp, server, application
    描述:为 rtmp 引擎设置最大连接数。默认为 off。
    max_connections 100;
    Statistics
    statistics 模块不同于本文列举的其他模块,它是 NGINX HTTP 模块。因此 statistics 指令应该位于 http{} 块内部。
    rtmp_stat
    语法:rtmp_stat all
    上下文:http, server, location
    描述:为当前 HTTP location 设置 RTMP statistics 处理程序。RTMP statistics 是一个静态的 XML 文档。可以使用 rtmp_stat_stylesheet 指令在浏览器中作为 XHTML 页面查看这个文档。
    http {
        server {
            location /stat {
                rtmp_stat all;
                rtmp_stat_stylesheet stat.xsl;
            }
            location /stat.xsl {
                root /path/to/stat/xsl/file;
            }
        }
    }
    rtmp_stat_stylesheet
    语法:rtmp_stat_stylesheet path
    上下文:http, server, location
    描述:添加 XML 样式表引用到 statistics XML 使其可以在浏览器中可视。更多信息请参考 rtmp_stat 描述和例子。
    Multi-worker live streaming
    多 worker 直播流是通过推送流到剩余的 nginx worker 实现的。
    rtmp_auto_push
    语法:rtmp_auto_push on|off
    上下文:root
    描述:切换自动推送(多 worker 直播流)模式。默认为 off。
    rtmp_auto_push_reconnect
    语法:rtmp_auto_push_reconnect timeout
    上下文:root
    描述:当 worker 被干掉时设置自动推送连接超时时间。默认为 100 毫秒。
    rtmp_socket_dir
    语法:rtmp_socket_dir dir
    上下文:root
    描述:设置用于流推送的 UNIX 域套接字目录。默认为 /tmp。
    rtmp_auto_push on;
    rtmp_auto_push_reconnect 1s;
    rtmp_socket_dir /var/sock;


    rtmp {
        server {
            listen 1935;
            application myapp {
                live on;
            }
        }
    }
    Control
    control 模块是 NGINX HTTP 模块,应该放在 http{} 块之内。
    rtmp_control
    语法:rtmp_control all
    上下文:http, server, location
    描述:为当前 HTTP location 设置 RTMP 控制程序。
    http {
        server {
            location /control {
                rtmp_control all;
            }
        }
    }

     





     

  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/12638985.html
Copyright © 2011-2022 走看看