相信有不少人都見過或者用過nginx-rtmp-module,感謝Arut開創性的工做。它是Nginx的一個優秀的第三方模塊,能夠用來直播,支持RTMP,HLS和DASH方式直播,還支持調用第三方軟件進行轉碼,錄製視頻等功能,因爲依託Nginx,性能也比較高。可是美中不足的地方也很多,例如首屏時間長,不支持HTTP-FLV方式直播,不支持虛擬主機(vhost)功能,省略listen配置沒法接受鏈接,有不少很明顯的bug等問題。nginx
從去年開始,我在nginx-rtmp-module的基礎上開發了nginx-http-flv-module,解決了上述的問題。固然,還有些bug還有待修復。具體使用方法請參考說明文件:git
爲何選擇Nginx做爲支持HTTP-FLV方式直播的服務器呢?由於Nginx的Web服務器功能對HTTP協議的支持很是完善,Nginx的性能優秀,通過了不少場景的檢驗。另外,Nginx自己對第三方軟件的依賴較少,很是易於部署。這些都使得它成爲HTTP-FLV方式直播服務器不可多得的選擇。github
listen
配置項而不影響基本功能下面簡單說說上述這些功能。緩存
能夠查看nginx-rtmp-module的Wiki。服務器
下面簡單說說nginx-http-flv-module在nginx-rtmp-modue基礎上新增的功能。網絡
支持VLC,OBS和flv.js等播放器播放,只須要輸入以下地址便可:app
http://yourdomain[:httpport]/dir?[rtmpport=xxx&]app=yyy&stream=zzz
複製代碼
其中httpport是Nginx的配置文件中http
塊中監聽的端口,若是這個端口是80,那麼能夠省略不寫;rtmpport是Nginx的配置文件中rtmp
塊中監聽的端口,若是這個端口是1935,那麼能夠省略不寫。dir
是Nginx的配置文件中http
塊中location
後的路徑。參數app和stream見下文的推流一節說明。dom
注意:ide
只須要在rtmp
塊中的application
塊中添加以下配置項便可:性能
gop_cache on;
複製代碼
如今的工程只緩存了兩個GOP,若是須要修改GOP緩存個數,能夠自行修改代碼,可是並不建議將GOP緩存的個數設置太大,由於發送GOP緩存可能須要不少次I/O操做,可能耗費比較多的時間,從而影響整個服務器的性能。
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
來指定域名,也支持前向通配,後向通配和徹底匹配:
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; #徹底匹配
}
複製代碼
注意:虛擬主機功能在多進程模式下還有問題。
listen
配置項而不影響基本功能這個略,你們能夠試試使用nginx-rtmp-module時,在rtmp
塊中不指定listen
,而後推流和播放會不會出現問題。
大可能是一些比較明顯的錯誤,如指令對應的宏寫錯了,消息個數計算錯誤等。
爲了簡便起見,假設不使用比較複雜的選項,這裏以ffmpeg爲例:
ffmpeg -re -i media_file -vcodec copy -acodec copy -f flv rtmp://yourdomain/app/stream
複製代碼
上文中HTTP-FLV的URL中的app和stream與這裏的app和stream對應,它們都是RTMP協議中的概念。
也可使用OBS推流,這裏再也不詳述。
在個人筆記本上(ThinkPad T410,Intel Core i5 M480,4G內存,Debian 7.11)壓力測試,單進程(多進程還有些問題沒解決)200推流和1000播放沒有問題。
答案是有的。我知道商用的有不下10家,規模比較大的一家是CDN廠商,另外一家是網絡電視廠商。另外,據網友反饋,國外也有網站在用這個模塊。打算使用本模塊最著名的廠商要數華爲了,可是我不太清楚他們拿這個模塊來作什麼,他們也沒說。
歡迎你們試用nginx-http-flv-module,也歡迎你們反饋bug和提pr。
最後貼兩張測試截圖做爲本文結束吧:
RTMP和HTTP-FLV測試截圖
flv.js測試截圖