在博主之前的博文《Ubuntu下安裝、編譯、運行nginx和nginx-rtmp-module》中講述了在linux(Ubuntu)下搭建nginx流媒體服務器的方法。下面講述在windows下搭建nginx流媒體服務器的方法,使其支持rtmp協議的直播以及通過配置支持直播狀態監聽。
一、nginx的安裝和配置
首先我們下載nginx。在nginx官網上下載的nginx是不帶rtmp模塊的,所以我們在http://nginx-win.ecsds.eu/download/中下載nginx 1.7.11.3 Gryphon.zip,如下圖所示。該版本的nginx包含rtmp組件,通過rtmp組件,才能提供流媒體服務,使nginx成爲rtmp流媒體服務器。
下載後我們解壓nginx 1.7.11.3 Gryphon.zip,得到nginx 1.7.11.3 Gryphon文件夾。使用命令提示符進入解壓後的路徑下,輸入命令
nginx.exe -v
上述命令的作用是查看nginx版本,輸入上述命令後出現下圖所示信息表示nginx安裝成功
我們在nginx 1.7.11.3 Gryphon目錄下新建三個目錄:m3u8File、rec、vod,如下圖所示:
然後我們進入nginx 1.7.11.3 Gryphon文件夾的conf目錄下,新建一個文件“nginx.conf”,如下圖所示:
打開nginx.conf,輸入如下信息後,保存。
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; #連續模式
#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;
}
}
}
然後我們通過命令提示符在nginx.exe所在的目錄下輸入命令:
nginx.exe -t
該命令的作用是檢查nginx的配置文件是否正確,當輸出如下信息時,表示配置文件nginx.conf正確了。
當通過上面的步驟驗證了nginx配置文件的正確性後,我們就可以啓動nginx了。通過命令提示符在nginx.exe所在的目錄下輸入命令:
start nginx
上述命令的作用是載入缺省./conf/nginx.conf配置文件,啓動nginx。輸入完成後,在瀏覽器中輸入nginx所在電腦的ip(該ip地址可以通過ipconfig命令查看,或者直接輸入127.0.0.1,localhost,也是可以的),得到下圖所示頁面,則表示nginx啓動成功了。然後用戶可以通過命令nginx.exe -s stop或者nginx.exe -s quit停止nginx。
啓動nginx成功的另一個標誌是在nginx 1.7.11.3 Gryphon文件夾的logs目錄下生成nginx.pid文件,如下圖所示:
該nginx.pid文件存放的是當前nginx主進程的ID號,打開該文件後可以看到裏面存放着“3980”這個數字,這個數字就是本次啓動nginx主進程的ID號(每次啓動的數字都會不同的)
我們可以在任務管理器中查詢到該進程,則表示nginx啓動成功了。
二、推流測試:
啓動nginx後,我們就可以進行推流、拉流測試了。推流指的是把採集階段封包好的內容傳輸到服務器的過程,主播端把本地採集的語音視頻流推送到媒體服務器。就是將現場的視頻信號傳到網絡的過程。下面我們使用ffmpeg將媒體文件video3.mp4推流到nginx中,然後通過vlc播放器播放出來。
在windows的命令提示符中執行命令:
ffmpeg -i video3.mp4 -f flv rtmp://127.0.0.1/live/test1
其中-i 表示輸入流。這裏的輸入流是video3.mp4。-f 表示設定的輸出格式。這裏因爲推流爲rtmp流得使用flv格式,所以設成-f flv。因爲是本機測試,所以推流的IP地址填127.0.0.1(也可以填用ipconfig命令查看到的nginx所在電腦的ip),推流地址爲rtmp://127.0.0.1/live/test1。關於"live"目錄,詳情可見《 關於使用FFmpeg推流時,live目錄的理解》。上述語句的意思是通過ffmpeg將媒體文件video3.mp4轉換成rtmp流,推流到本機的nginx服務器中。
執行完上述命令,會出現如下界面,表示推流成功了。
三、拉流測試
拉流指的是用戶端從服務器拉取語音視頻流到客戶端播放。下面我們會通過vlc拉流nginx中的語音視頻流,然後在vlc播放。執行完上述推流的步驟後,我們在windows中打開vlc,點擊“打開網絡串流”,如下圖所示:
輸入網絡URL,如下圖所示(因爲是本機測試,所以IP地址填127.0.0.1,也可以填用ipconfig命令查看到的nginx所在電腦的ip))
可以看到在vlc中出現視頻畫面了,表示拉流成功了
四、進行直播狀態監聽
我們在https://github.com/arut/nginx-rtmp-module/,下載nginx-rtmp-module-master.zip,解壓後複製到目錄:nginx 1.7.11.3 Gryphon下,如下圖所示:
在nginx-rtmp-module-master目錄下,我們可以看到有個文件stat.xsl。這正好對應於配置文件nginx.conf中的設置,如下圖所示:
然後我們在瀏覽器中輸入http://127.0.0.1/stat。如下圖所示,在下面的頁面中我們就可以進行直播狀態監聽了。
五、遇到的問題和注意事項
1.啓動nginx報錯,如下圖所示。產生該問題的原因爲nginx安裝路徑含有中文,選一個不含中文的路徑安裝即可解決這個問題。
2.使用vlc拉流播放視頻會很卡,而且會很模糊。我們改變ffmpeg推流的命令,如下所示,再拉流播放,即可緩解這個問題。
ffmpeg -re -i video3.mp4 -vcodec h264 -acodec copy -f flv rtmp://127.0.0.1/live/test1
3.nginx服務器默認佔用的端口爲1935(rtmp服務端口)和80(http端口)(這兩個端口可以從配置文件nginx.conf中更改)。啓動nginx前請在命令提示符中用"netstat -ano"命令查看這兩個端口是否已經被佔用,保證這兩個端口沒有被其它程序佔用
4.啓動nginx前最好要關閉所在電腦的防火牆
六、其它相關文章的鏈接
1.本文僅僅講述使nginx支持rtmp協議的直播的方法。要想使其支持hls協議的直播和rtmp點播,請參考:《在windows下配置nginx流媒體服務器,使其支持hls協議的直播和rtmp點播》
2.本文講述的是在windows下安裝,配置nginx的例子。下面的兩篇文章講述的是在linux下安裝、配置nginx的方法
《Ubuntu下安裝、編譯、運行nginx和nginx-rtmp-module》,《使用FFmpeg將視頻推流到nginx,通過vlc拉流播放(通過命令的方式)》
3.本文搭建出來的nginx是隻能在局域網(內網)內訪問,要想實現外網也能訪問,可以參考文章《將nginx部署在阿里雲上實現公網訪問本地nginx、外網推流播放音視頻流》