支持HTTP-FLV方式直播的開源模塊nginx-http-flv-module

nginx-http-flv-module是在nginx-rtmp-module基礎上開發的一個直播模塊。
感謝Arut創造了nginx-rtmp-module,它是Nginx的一個優秀的第三方模塊,能夠用來直播,支持RTMP,HLS和DASH方式直播,還支持調用第三方軟件進行轉碼,錄製視頻等功能,因爲依託Nginx,性能也比較高。可是美中不足的地方也很多,例如首屏時間長,不支持HTTP-FLV方式直播,不支持虛擬主機(vhost)功能,省略listen配置沒法接受鏈接,有不少很明顯的bug等問題。
nginx-http-flv-module解決了上述的問題。固然,還有些bug還有待修復。具體使用方法請參考說明文件:nginx

爲何選擇Nginx做爲支持HTTP-FLV方式直播的服務器呢?由於Nginx的Web服務器功能對HTTP協議的支持很是完善,Nginx的性能優秀,通過了不少場景的檢驗。另外,Nginx自己對第三方軟件的依賴較少,很是易於部署。這些都使得它成爲HTTP-FLV方式直播服務器不可多得的選擇。git

nginx-http-flv-module的功能

  1. 兼容nginx-rtmp-module全部功能
  2. 支持HTTP-FLV方式的直播
  3. 支持GOP緩存,以減小首屏時間
  4. 支持虛擬主機功能
  5. 能夠省略listen配置項而不影響基本功能
  6. 修復nginx-rtmp-module已知的bug

功能簡介

  1. 兼容nginx-rtmp-module的全部功能,詳細說明參考nginx-rtmp-moduleWiki
  2. 支持HTTP-FLV方式的直播
    支持的播放器有VLCOBSflv.js等,只須要輸入以下地址便可:github

    http://yourdomain[:httpport]/dir?[rtmpport=xxx&]app=yyy&stream=zzz

    其中httpport是Nginx的配置文件中http塊中監聽的端口,若是這個端口是80,那麼能夠省略不寫;rtmpport是Nginx的配置文件中rtmp塊中監聽的端口,若是這個端口是1935,那麼能夠省略不寫。dir是Nginx的配置文件中http塊中location後的路徑。參數app和stream見下文的推流一節說明。
    nginx-http-flv-module也支持HTTPS-FLV方式的直播。緩存

  3. 支持GOP緩存,以減小首屏時間
    只須要在rtmp塊中的application塊中添加以下配置項便可:服務器

    gop_cache on;

    如今的代碼中只緩存兩個GOP,若是須要修改GOP緩存個數,能夠自行修改代碼,可是不建議將GOP緩存的個數設置太大,由於發送GOP緩存可能須要不少次I/O操做,可能耗費比較多的時間,從而影響整個服務器的性能。網絡

  4. 支持虛擬主機功能
    nginx-rtmp-module不支持虛擬主機功能。那什麼是虛擬主機功能呢?假設有一臺服務器,其IP地址是192.168.1.110,我配置了一個DNS服務器,將兩個域名www.testa.com和www.testb.com都指向192.168.1.110,那麼對於Web服務,我能夠針對這兩個域名配置不一樣的Web頁面,經過不一樣的域名訪問不一樣的Web頁面,但其實這兩個不一樣的服務都指向同一臺服務器。這兩個域名對應同一個IP地址就是虛擬主機功能。與http配置同樣,nginx-http-flv-module經過server_name來指定域名,也支持前向通配,後向通配和徹底匹配:app

    server {
        server_name *.test.com; #前向通配,匹配blog.test.com/login.test.com等
        ...
    }
    
    server {
        server_name www.test.*; #後向通配,匹配www.test.org/www.test.com等
        ...
    }
    
    server {
        server_name www.test.com; #徹底匹配
    }

    注意:虛擬主機功能在多進程模式下還有問題。dom

  5. 能夠省略listen配置項而不影響基本功能
    這個略,你們能夠試試使用nginx-rtmp-module時,在rtmp塊中不指定listen,而後推流和播放會不會出現問題。
  6. 修復nginx-rtmp-module已知的bug
    大可能是一些比較明顯的錯誤,如指令對應的宏寫錯了,消息個數計算錯誤等。

推流

爲了簡便起見,假設不使用比較複雜的選項,這裏以ffmpeg爲例:ide

ffmpeg -re -i media_file -vcodec copy -acodec copy -f flv rtmp://yourdomain/app/stream

上文中HTTP-FLV的URL中的app和stream與這裏的app和stream對應,它們都是RTMP協議中的概念。
也可使用OBS推流,這裏再也不詳述。性能

nginx-http-flv-module性能如何?

在個人筆記本上(ThinkPad T410,Intel Core i5 M480,4G內存,Debian 7.11)壓力測試,單進程(多進程還有些問題沒解決)200推流和1000播放沒有問題。

有人用nginx-http-flv-module嗎?

答案是有的。我知道商用的有不下10家,規模比較大的一家是CDN廠商,另外一家是網絡電視廠商。另外,據網友反饋,國外也有網站在用這個模塊。還有華爲也打算使用本模塊,這是我已知的最大的一個對本模塊感興趣的廠商了。
歡迎你們試用nginx-http-flv-module,也歡迎反饋bug和提交pr。
最後貼兩張調試nginx-http-flv-module時的測試截圖:

RTMP和HTTP-FLV測試截圖
RTMP和HTTP-FLV測試截圖

flv.js測試截圖
flv.js測試截圖

相關文章
相關標籤/搜索