windows使用nginx配置rtmp,hls,httpflv

一字旭、綜述

引用自知乎 作為程序員验夯,你有哪些正在做的個人項目?

從今年年初開始,公司就沒什么事了泣棋,混吃等死雕薪,總琢磨著寫點玩意兒昧诱,在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)定,在此表示感謝黄痪。


image.png
二紧帕、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這個版本。

image.png

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文件,如下圖所示:


image.png

該nginx.pid文件存放的是當前nginx主進程的ID號赵辕,打開該文件后可以看到里面存放著“3980”這個數字既绩,這個數字就是本次啟動nginx主進程的ID號(每次啟動的數字都會不同的)


image.png

我們可以在任務管理器中查詢到該進程,則表示nginx啟動成功了还惠。
image.png
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)聽了充活。

image.png

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末位隶,一起剝皮案震驚了整個濱河市拷窜,隨后出現的幾起案子,更是在濱河造成了極大的恐慌涧黄,老刑警劉巖篮昧,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異笋妥,居然都是意外死亡懊昨,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門春宣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酵颁,“玉大人,你說我怎么就攤上這事信认〔囊澹” “怎么了均抽?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵嫁赏,是天一觀的道長。 經常有香客問我油挥,道長潦蝇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任深寥,我火速辦了婚禮攘乒,結果婚禮上,老公的妹妹穿的比我還像新娘惋鹅。我一直安慰自己则酝,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布闰集。 她就那樣靜靜地躺著沽讹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪武鲁。 梳的紋絲不亂的頭發(fā)上爽雄,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音沐鼠,去河邊找鬼挚瘟。 笑死叹谁,一個胖子當著我的面吹牛,可吹牛的內容都是我干的乘盖。 我是一名探鬼主播焰檩,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侧漓!你這毒婦竟也來了锅尘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤布蔗,失蹤者是張志新(化名)和其女友劉穎藤违,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體纵揍,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡顿乒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了泽谨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片璧榄。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吧雹,靈堂內的尸體忽然破棺而出骨杂,到底是詐尸還是另有隱情,我是刑警寧澤雄卷,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布搓蚪,位于F島的核電站,受9級特大地震影響丁鹉,放射性物質發(fā)生泄漏妒潭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一揣钦、第九天 我趴在偏房一處隱蔽的房頂上張望雳灾。 院中可真熱鬧,春花似錦冯凹、人聲如沸谎亩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匈庭。三九已至,卻和暖如春空凸,著一層夾襖步出監(jiān)牢的瞬間嚎花,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工呀洲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留紊选,地道東北人啼止。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像兵罢,于是被迫代替她去往敵國和親献烦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容