Nginx RTMP 流媒體直播
RTMP(Real Time Messaging Protocol)實時訊息傳送協議是Adobe Systems公司為Flash播放器和伺服器之間音訊、視訊和資料傳輸開發的私有協議。
它有三種變種:
1)工作在TCP之上的明文協議,使用埠1935;
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是一款高效能、多執行緒的流媒體伺服器軟體。專為多種終端裝置提供音視訊內容播放服務,支援iOS、windows、Android、BlackMerry等系統的終端裝置,以HTTP、RTSP/ RTP、RTMP傳輸協議的流播放,還支援利用機頂盒進行播放的
通過對Wowza Media Server的深度定製開發,尚為網路視聽管理系統實現了對網路音視訊內容的採集、編碼、編輯、轉碼、稽核、播出與監控等完整的生命週期管理,突出了以下能力:
1)自動化內容收錄
對網路視訊的錄製,採用伺服器端錄製模式,滿足從28Kbps到10Mbps碼流範圍的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
配置檔案
- worker_processes 1;
- error_log logs/error.log debug;
- #error_log logs/error.log notice;
- #error_log logs/error.log info;
- #pid logs/nginx.pid;
- events {
- worker_connections 1024;
- }
- rtmp {
- server {
- listen 1935;
- chunk_size 128;
- publish_time_fix off;
- application myapp {
- live on;
- record keyframes;
- record_path /tmp;
- record_max_size 128K;
- record_interval 30s;
- record_suffix .flv;
- on_publish http://localhost:8080/publish;
- on_play http://localhost:8080/play;
- on_record_done http://localhost:8080/record_done;
- }
- application myapp2 {
- live on;
- }
- # application mypull {
- # live on;
- # pull myapp mystream localhost;
- # }
- # application mypush {
- # live on;
- # push myapp mystream localhost;
- # push myapp2 mystream localhost;
- # }
- }
- }
- http {
- server {
- listen 8080;
- location /publish {
- return 201;
- }
- location /play {
- return 202;
- }
- location /record_done {
- return 203;
- }
- location /stat {
- rtmp_stat all;
- rtmp_stat_stylesheet stat.xsl;
- }
- location /stat.xsl {
- root /home/wujianzhi/nginx-rtmp-module/;
- }
- location /rtmp-publisher {
- root /home/wujianzhi/nginx-rtmp-module/test;
- }
- location / {
- root /home/wujianzhi/nginx-rtmp-module/test/www;
- }
- }
- }
測試用例:
/home/wujianzhi/nginx-rtmp-module/test/rtmp-publisher
/home/wujianzhi/nginx-rtmp-module/test/www
測試URL:
測試的檔案在rtmp_publisher資料夾下:如果測試不成功,修改檔案的地址,如publisher.html,將localhost改成伺服器ip