Nginx RTMP 流媒体直播

1. RTMP协议介绍

       RTMP(Real Time Messaging Protocol)实时消息传送协议是Adobe Systems公司为Flash播放器和服务器之间音频、视频和数据传输开发的私有协议。

它有三种变种:

1)工作在TCP之上的明文协议,使用端口1935

2)RTMPT封装HTTP请求之中,可穿越防火墙

3)RTMPS类似RTMPT,但使用的是HTTPS连接;

        RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据。一个单一的连接可以通过不同的通道传输多路网络流。这些通道中的包都是按照固定大小的包传输的。

 

   


                                           1   RTMP交互图 

更多协议的细节可以参见《rtmp specification 1.0

2. RTMP server

2.1当前的流媒体server

      现在主要有两种rtmp server,商业的和开源的。商业的比开源的支持的功能多,个人根据需要选择吧

  商业的有FMS Wowza

  开源RTMP server

  1.  red5 java  有名

  2.  crtmpserver c++ 支持多种rtmp协议,移动设备以及IPTV相关网络协议 http://www.rtmpd.com/ Erlyvideo erlong 有开源和商业版本 https//github.com/erlyvideo/erlyvideo h

 3.  aXeVideo haXe 一个实验性的,轻量级的服务器 http://code.google.com/p/haxevideo/ 

 4. FluorineFx .Net To be defined http://www/fluorinefx.com 

 5. nginx-rtmp c nginx模块 支持rtmp和HLS https://github.com/arut/nginx-rtmp-module

2.2 Wowza功能

      FMS是Adobe公司的产品,license非常昂贵。下面就wowza这个商业软件讲下流媒体Server,不仅仅是RTMP Server,在达到生产环境所需要的功能。wowza最突出的特定是多终端适应性,这个在如今多媒体融合的网络环境下有很强的实用意义。究其原理并无深入研究。国内尚为视讯是其代理公司。

      Wowza Media Server是一款高性能、多线程的流媒体服务器软件。专为多种终端设备提供音视频内容播放服务,支持iOSwindowsAndroidBlackMerry等系统的终端设备,以HTTPRTSP/ RTPRTMP传输协议的流播放,还支持利用机顶盒进行播放的IPTV

     通过对Wowza Media Server的深度定制开发,尚为网络视听管理系统实现了对网络音视频内容的采集、编码、编辑、转码、审核、播出与监控等完整的生命周期管理,突出了以下能力:

1) 自动化内容收录

  对网络视频的录制,采用服务器端录制模式,满足从28Kbps10Mbps码流范围的H.264编码流的自动化定时收录。

2) 快速在线编辑

云计算架构设计,服务器端处理。所有编辑任务都处在云端,对编辑机无要求,任务处理快捷简单。

  对视频的处理包括切条、合并、去除广告、添加logo等操作。

  支持同一素材多格式文件的一次性编辑处理,提高工作效率。

3) 云式转码

  采用云转码技术开发的音视频文件转码、实时流转码,实现了不同格式、码率、分辨率、帧数等参数的自由转换,满足不同终端的播放需求。

4) 多终端发布支持

  结合Wowza Media Server支持多协议多终端的特性,尚为网络视听系统一个平台即可支持多终端设备的视频访问,无论用任何设备都可访问所需的视频内容。

  在对多终端内容统一管理的基础之上,还可实现了多终端视频的断点续播功能。用户的播放在一个终端上播放暂停后,用户的信息、节目信息以及断点信息立刻传送给其它终端,实现了不同终端间的断点续播。

5) 稳定的安全保障

  全LINUX架构,保障系统的安全性。

  自动支持负载均衡部署,可满足大并发用户的数据响应处理。

扩展性好,可随需增减流媒体服务器来变更系统承载的并发用户数。

除此之外,个人认为完善的DRM版权管理对于视频直播分发是非常重要的功能,服务器状态实时监控是对运营的高效稳定也有非常最要的功能。

3. Nginx-basedRTMP server

3.1  Nginx rtmp 功能点

1.   支持音视频直播

2.   支持flv/mp4视频格式,输入可以是文件或者HTTP流

3.   支持两种流的分发模式 pushand pull

4.   可以将直播流录制成flv文件

5.   H264/AAC编码

6.   支持在线转码 Onlinetranscoding with FFmpeg

7.   支持HLS (HTTP LiveStreaming)需要 libavformat (>= 8. 53.31.100) from ffmpeg (ffmpeg.org)

8.   HTTPcallbacks (publish/play/record/update etc)

9.   支持外部程序(exec)

10.  HTTPcontrol module for recording audio/video and dropping clients

11.  先进内存控制技术,可以在使用少量内存的情况下完成流畅的直播功能。

12 . 可以和以下协同工作。FMS server(Wirecast, FMS, Wowza,)Player(JWPlayer, FlowPlayer, StrobeMediaPlayback,)外部程序(ffmpeg,avconv,rtmpdump,flvstreamer )

13. Statistics in XML/XSL in machine- & human- readable form

14.  支持跨平台 Linux/FreeBSD/MacOS

项目地址

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

nginx-rtmp-module Directives

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

      总的来说Nginx-RTMP是个比较轻量的项目,可以满足直播的采集,编码和分发工作,该项目丰富的完善了nginx对视频的支持,特别的nginx-rtmp实现了对HLS的支持。

3.2 编译nginx rtmp模块

编译安装,和其他nginx模块一样

./configure--add-module=/path/to/nginx-rtmp-module

对于HLS的支持,需要额外的一个模块 .

./configure--add-module=/path/to/nginx-rtmp-module--add-module=/path/to/nginx-rtmp-module/hls

 

3.3 配置以及功能介绍

RTMP 直播的一般格式是rtmp://youdomain.com/app/name,其中app的名字对于application的名字,

1.      下列是直播的配置,app是live。

application live {
    live on;
}

2.    配置支持访问控制,你可以指定允许发布的IP以及允许收看的IP:

application live {
    live on;
    allow publish 127.0.0.1;
    deny publish all;
    allow play all;

3.   支持Multi-worker streaming工作方式,需要指令rtmp_auto_push on支持,这样nginx有多个worker的情况下,可以将流分发到多个进程进行处理,充分利用服务器资源。

rtmp_auto_push on;
rtmp {
    server {
        listen 1935;
        chunk_size 4000;
        # TV mode: one publisher, many subscribers
        application mytv {
            live on;
        }
    }
}

4. 流转码的功能,下面的例子使用了exec这种使用外部程序ffmpeg的功能.  Ffmpeg是一个强大的媒体处理工具,几乎可以做任意有关video/audio的处理。更多ffmpeg与RTMP流媒体连接用法可以参考以下链接。

http://www.chinavideo.org/viewthread.php?tid=15423 

# Transcoding (ffmpeg needed)
application big {
            live on;
            # Multiple exec lines can be specified.
            exec /usr/bin/ffmpeg -re -i rtmp://localhost:1935/$app/$name -vcodec flv -acodec copy -s 32x32 -f flv rtmp://localhost:1935/small/${name};
}
application small {
            live on;
            # Video with reduced resolution comes here from ffmpeg
}

5.Push和pull模式,用在多个server协助的情况下,输出流可以push,输入流可以pull 

        application mypush {
            live on;
            # Every stream published here
            # is automatically pushed to 
            # these two machines
            push rtmp1.example.com;
            push rtmp2.example.com:1934;
        }
 
        application mypull {
            live on;
            # Pull all streams from remote machine
            # and play locally
            pull rtmp://rtmp3.example.com pageUrl=www.example.com/index.html;
        }

3.4 用nginx-rtmp-module搭建直播环境

1.      需要准备视频源,这个可以使用ffmpeg模拟,或者通过FMS采集。使用ffmpeg比较方便,例如ffmpeg -re -i /root/test123.flv -f flv rtmp://192.168.100.135/myapp/test,这样一条命令就可以发布一个直播源。

2.      配置nginx-rtmp,完成相关功能配置,可以参考以上描述。

3.      搭建客户端测试环境,本文测试播放器使用的是jwplayer

 

https://github.com/arut/nginx-rtmp-module项目里面test目录下有相关的播放器设置和配置文件。

配置文件

[html]  view plain copy
  1. worker_processes  1;  
  2.   
  3. error_log  logs/error.log debug;  
  4. #error_log  logs/error.log  notice;  
  5. #error_log  logs/error.log  info;  
  6.   
  7. #pid        logs/nginx.pid;  
  8.    
  9. events {  
  10.     worker_connections  1024;  
  11. }  
  12.   
  13. rtmp {  
  14.     server {  
  15.         listen 1935;  
  16.         chunk_size 128;  
  17.         publish_time_fix off;  
  18.   
  19.         application myapp {   
  20.             live on;  
  21.             record keyframes;  
  22.             record_path /tmp;  
  23.   
  24.             record_max_size 128K;  
  25.             record_interval 30s;  
  26.   
  27.             record_suffix .flv;  
  28.   
  29.             on_publish http://localhost:8080/publish;  
  30.             on_play http://localhost:8080/play;  
  31.             on_record_done http://localhost:8080/record_done;  
  32.         }  
  33.   
  34.         application myapp2 {  
  35.             live on;  
  36.         }  
  37.   
  38. #        application mypull {  
  39. #            live on;  
  40. #            pull myapp mystream localhost;  
  41. #        }  
  42.   
  43. #        application mypush {  
  44. #            live on;  
  45. #            push myapp mystream localhost;  
  46. #            push myapp2 mystream localhost;  
  47. #        }  
  48.     }  
  49. }  
  50.   
  51. http {  
  52.     server {  
  53.         listen      8080;  
  54.         location /publish {  
  55.             return 201;  
  56.         }  
  57.   
  58.         location /play {  
  59.             return 202;  
  60.         }  
  61.   
  62.         location /record_done {  
  63.             return 203;  
  64.         }  
  65.   
  66.         location /stat {  
  67.             rtmp_stat all;  
  68.             rtmp_stat_stylesheet stat.xsl;  
  69.         }  
  70.   
  71.         location /stat.xsl {  
  72.             root /home/wujianzhi/nginx-rtmp-module/;  
  73.         }  
  74.   
  75.         location /rtmp-publisher {  
  76.             root /home/wujianzhi/nginx-rtmp-module/test;  
  77.         }  
  78.         location / {  
  79.             root /home/wujianzhi/nginx-rtmp-module/test/www;  
  80.         }  
  81.   
  82.   
  83.     }  
  84. }  
  85.   
  86.                   

测试用例:

/home/wujianzhi/nginx-rtmp-module/test/rtmp-publisher

/home/wujianzhi/nginx-rtmp-module/test/www

测试URL:

http://10.211.55.5:8080/index.html

http://10.211.55.5:8080/rtmp-publisher/player.html

测试的文件在rtmp_publisher文件夹下:如果测试不成功,修改文件的地址,如publisher.html,将localhost改成服务器ip

Nginx RTMP 流媒体直播_第1张图片

Nginx RTMP 流媒体直播_第2张图片

你可能感兴趣的:(流媒体)