一字旭、綜述
從今年年初開始,公司就沒什么事了泣棋,混吃等死雕薪,總琢磨著寫點玩意兒昧诱,在github上閑逛,偶爾發(fā)現些bug所袁,能解的就解了盏档。這兩年直播不是挺火么?我就用RTSP燥爷,RTMP等搜了下相關的開源項目蜈亩,找到兩個:srs(simple-rtmp-server)和nginx-rtmp-module。
前者是國人楊成立發(fā)起的前翎,國內使用它的廠商很多稚配,遺憾的是3.x版已經閉源。而后者是一個俄羅斯人發(fā)起的港华,遺憾的是作者已經多年不更新了道川。后來發(fā)現nginx-rtmp-module不支持HTTP方式播放直播流,而這是很多廠商支持的立宜,況且Nginx本身就是個優(yōu)秀的Web服務器冒萄,對HTTP協議支持得很好,那為什么不在nginx-rtmp-module上支持HTTP方式播放直播流呢橙数?說干就干尊流,于是從5月開始加功能,一直到7月底灯帮,基本把HTTP直播播放的功能加上了:https://github.com/winshining/nginx-http-flv-module
以下參考nginx-http-flv-module作者的
基于nginx-rtmp-module模塊實現的HTTP-FLV直播模塊nginx-http-flv-module(一)
基于nginx-rtmp-module模塊實現的HTTP-FLV直播模塊nginx-http-flv-module(二)
基于nginx-rtmp-module模塊實現的HTTP-FLV直播模塊nginx-http-flv-module(三)
近幾年直播行業(yè)火爆奠旺,開源的直播軟件解決方案有SRS(Simple-RTMP-Server)和nginx-rtmp-module,前者是國人發(fā)起的一個優(yōu)秀的開源項目施流,目前國內很多公司都使用它作為直播解決方案响疚,由C++編寫;后者依賴Nginx瞪醋,以第三方模塊的方式提供直播功能忿晕,由C編寫。
SRS采用多線程方式(經網友提醒更正:是單線程+協程方式)银受,性能優(yōu)秀践盼,經受住了眾多場景的考驗鸦采,但是SRS3已經閉源(更正:是有一段時間閉源了,現在又開源了)咕幻;
nginx-rtmp-module是采用多進程方式渔伯,Nginx的性能優(yōu)秀,但是據網友測試肄程,同為單進程條件下锣吼,nginx-rtmp-module的性能不如SRS,并且nginx-rtmp-module的作者已經很久沒有更新版本了蓝厌,支持的功能也有限玄叠,例如不支持HTTP方式的FLV直播,而這是國內直播行業(yè)普遍采用的方式拓提;再如推流不支持upstream读恃,無法分布式部署功能;還有飽受詬病的播放響應延遲時間很長的問題(即俗稱的不能秒播)等代态。
我在nginx-rtmp-module的基礎上實現了基于HTTP方式的FLV直播功能寺惫,支持GOP緩存,減少了首屏時間蹦疑;支持流式和chunked兩種HTTP響應格式肌蜻;修復nginx-rtmp-module沒有l(wèi)isten配置項時,推拉流失敗的問題必尼;解決nginx-rtmp-module已知的bug蒋搜,見nginx-http-flv-module,歡迎下載測試和反饋bug判莉,也歡迎提PR豆挽。有問題或者建議,可以加Q群:711969608詳聊券盅,注意:進群請先查看群說明和群公告帮哈,編譯問題(除了一些確實是因為兼容問題不能編譯的),能通過README和wiki解決的配置問題請優(yōu)先自行解決锰镀,回復問題不是群友的義務娘侍,因為絕大多數群友有自己的工作。
目前已經有很多個人和廠商準備將本模塊商用泳炉。據網友反饋憾筏,國外已經有直播網站在使用這個模塊。國內準備商用的廠商有華為花鹅,中興(網友告知氧腰,未確認)等。另外據網友反饋,EasyDSS和EasyNVR也集成了本模塊的功能古拴。網友和廠商陸續(xù)反饋過不少bug箩帚,修復后功能已經越來越穩(wěn)定,在此表示感謝黄痪。
二紧帕、SRS部分資料
參考
SRS大神楊成立
SRS(simple-rtmp-server)直播點播服務器
SRS Github
SRS HTTP FLV
CRtmpServer轉推流到Nginx Rtmp及SRS(SimpleRtmpServer)的經歷
通讀SRS后的總結文檔以及搭建直播平臺的初次嘗試
SRS/3.0,OuXuli桅打,是一個流媒體集群是嗜,支持RTMP/HLS/FLV,高效油额、穩(wěn)定、易用刻帚,簡單而快樂潦嘶。
三、nginx-rtmp-module搭建
參考
Nginx - Windows下Nginx初入門
Windows下Nginx的啟動崇众、停止等命令
在Windows下搭建基于nginx的視頻直播和點播系統(tǒng)
Linux&Windows搭建基于nginx的視頻點播服務器
在windows下搭建沫勿、配置nginx流媒體服務器闯传,并進行rtmp流的推流、拉流測試
在nginx官網上下載的nginx是不帶rtmp模塊的。如果只是做點播浪感,Nginx本身不需要任何額外的模塊就支持flv和mp4格式的點播,也支持拖動進度條.
所幸览闰,已經有大神做好了nginx的編譯吨娜,而且集成了很多nginx模塊,其中就已經包括了nginx-rtmp-module赦抖。
下載地址:http://nginx-win.ecsds.eu/舱卡,詳細說明可參見:Readme nginx-win version.txt
我下載的是nginx 1.7.11.3 Gryphon這個版本。
1.nginx常用命令
start nginx
nginx -s reload
nginx -s stop
nginx -c 指定一個配置文件队萤。默認的路徑是安裝目錄下的conf/nginx.conf
nginx -t 檢查配置文件是否正確
修改conf/nginx.conf配置文件轮锥,然后在nginx.exe路徑下命令行(PowerShell不行)運行nginx -s reload
重新加載配置。
如果報錯nginx: [error] OpenEvent("Global\ngx_reload_38192") failed (2: The system cannot find the file specified)
要尔,則說明nginx服務器未啟動成功舍杜。
啟動nginx成功的另一個標志是在nginx 1.7.11.3 Gryphon文件夾的logs目錄下生成nginx.pid文件,如下圖所示:
該nginx.pid文件存放的是當前nginx主進程的ID號赵辕,打開該文件后可以看到里面存放著“3980”這個數字既绩,這個數字就是本次啟動nginx主進程的ID號(每次啟動的數字都會不同的)
我們可以在任務管理器中查詢到該進程,則表示nginx啟動成功了还惠。
2.配置rtmp及點播
參考配置如下
worker_processes 1; #Nginx進程數熬词,建議設置為等于CPU總核數
events {
worker_connections 1024; #工作模式與連接數上限
}
rtmp_auto_push on;
#RTMP服務
rtmp{
server{
listen 1935; #服務端口
chunk_size 4096; #數據傳輸塊的大小
application vod{
play ./vod; #視頻文件存放位置
}
application live{
live on; #開啟直播
hls on; #開啟hls直播。這個參數把直播服務器改造成實時回放服務器
#wait_key on; #對視頻切片進行保護,這樣就不會產生馬賽克了
hls_path ./m3u8File; #切片視頻文件存放位置(HLS互拾,m3u8文件存放位置)
hls_fragment 2s; #每個視頻切片的時長
hls_playlist_length 16s;
recorder myRecord{
record all manual;
record_suffix _.flv;
record_path ./rec;
}
#hls_continuous on; #連續(xù)模式
#hls_cleanup on; #對多余的切片進行刪除
#hls_nested on; #嵌套模式
}
}
}
#HTTP服務
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type設置
application/vnd.apple.mpegurl m3u8;
#ts分片文件設置
video/mp2t ts;
}
#指向訪問m3u8文件目錄
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止緩存
}
location /control{
rtmp_control all;
}
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.關于使用FFmpeg推流時歪今,live目錄的理解
在nginx.conf中
#RTMP 直播流配置
application live{
live on;
record off;
}
使用“ ffmpeg -i "D:\nginx1.7\vod\jay.flv" -f flv rtmp://127.0.0.1/live/test1”
中推流⊙湛螅“ live ”其實是一個虛擬目錄寄猩,這個目錄和windows中傳統(tǒng)的目錄是不一樣的,可以理解為推流到的流媒體服務器的模塊路徑或者虛擬路徑骑疆,但是實際在流媒體服務器中是不會存在這個目錄的田篇,因為它是虛擬的。這個目錄其實是用來區(qū)分流的箍铭,表示要推流到的地址泊柬;推流地址為多少,拉流地址就得為多少诈火。比如推流指令為“ ffmpeg -i video3.mp4 -f flv rtmp://127.0.0.1/live/test1 ”
兽赁,使用ffplay進行拉流的指令就得為“ ffplay rtmp://127.0.0.1/live/test1”
,可以看到推流地址和拉流地址是對應的冷守。
這里推流很快就結束了刀崖,然后就無法播放了∨囊。可以加一下re參數
"-re":按視頻幀率的速度讀取輸入
"-c copy":輸出流使用和輸入流相同的編解碼器
"-f flv":指定輸出流封裝格式為flv
4.直播狀態(tài)監(jiān)控
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module;
}
然后我們在瀏覽器中輸入http://127.0.0.1/stat亮钦。如下圖所示,在下面的頁面中我們就可以進行直播狀態(tài)監(jiān)聽了充活。
5.點播
上面這個配置就是點播了:
application vod{
play ./vod; #視頻文件存放位置
}
使用VLC播放rtmp://127.0.0.1/vod/jay.flv
即可蜂莉。
當然點播不使用RTMP插件nginx自身也是可以實現點播服務的。那就是配置http的location部分:
server {
listen 80;
server_name localhost;
location /01.mp4 {
root vod;
}
location /jay.flv {
root vod;
}
location /265.mp4 {
root vod;
}
現在使用http://127.0.0.1/jay.flv
也可以點播了
6.配置hls
參考在windows下配置nginx流媒體服務器混卵,使其支持hls協議的直播和rtmp點播
這里我還是把hls從live配置中剝離出來巡语,單獨做了一個配置
rtmp{
server{
listen 1935;
application vod {
play ./vod; #這是一個目錄的名稱,如果是linux淮菠,則寫具體位置如/opt/video
}
#直播流配置
application live{
live on;
recorder myRecord{
record all manual;
record_suffix _.flv;
record_path ./rec;
}
}
application hls {
live on;
hls on;
hls_path ./m3u8File;
hls_fragment 5s;
}
}
}
然后http配置:
location /hls {
types {
application/vnd.apple.mpegurl m3u8;#m3u8 type設置
video/mp2t ts;#ts分片文件設置
}
alias ./m3u8File;
expires -1;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
}
推流
ffmpeg -re -i "D:\nginx1.7\vod\jay.flv" -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/hls/cctv1
可以在m3u8File文件夾下看到許多TS文件和m3u8文件男公,并且一直在更新。
此時在VLC中播放http://127.0.0.1:80/hls/cctv1.m3u8
即可看到畫面合陵,注意剛開始推流時可能還無法播放枢赔,要延遲幾秒等m3u8生成后才能播放。
四拥知、nginx-http-flv-module搭建
參考
https://github.com/winshining/nginx-http-flv-module/blob/master/README.CN.md
注意nginx-http-flv-module 包含了 nginx-rtmp-module 所有的功能踏拜,所以不要將 nginx-http-flv-module 和 nginx-rtmp-module 一起編譯。
只是做測試的話低剔,還是找WINDOWS版本的省事兒速梗。感謝csdn的博主bugNotBug肮塞,提供不需要積分的下載鏈接nginx-1.19.6_nginx-http-flv-module(64位),這里可以參考此博主另一個鏈接nginx-1.19.3_nginx-http-flv-module.rar,把里面的http-flv.conf復制過去姻锁。
推流:
ffmpeg -re -i "D:\nginx1.7\vod\jay.flv" -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/myapp/cctv1
拉h(huán)ttp-flv流
http://127.0.0.1:80/live?port=1935&app=myapp&stream=cctv1
拉rtmp流
rtmp://127.0.0.1/myapp/cctv1
當然這個模塊參照上面HLS的設置枕赵,也是可以提供HLS直播的,不過要另推hls流
ffmpeg -re -i "D:\nginx1.7\vod\jay.flv" -vcodec copy -acodec copy -f flv rtmp://127.0.0.1:1935/hls/cctv1