1. 程式人生 > >Nginx RTMP 流媒體直播

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

      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版權管理對於視訊直播分發是非常重要的功能,伺服器狀態實時監控是對運營的高效穩定也有非常最要的功能。

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

專案地址

nginx-rtmp-module 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;
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流媒體連線用法可以參考以下連結。

# 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

配置檔案

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

測試用例:

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

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

測試URL:

測試的檔案在rtmp_publisher資料夾下:如果測試不成功,修改檔案的地址,如publisher.html,將localhost改成伺服器ip