使用nginx搭建rtmp伺服器
一、軟體需求
1、nginx原始碼包 下載地址:http://nginx.org/。筆者下載的是1.10.3。
2、pcre原始碼包。這是一個正則表示式庫。nginx會用到這個開源庫來做正則匹配。很多軟體都會引用,比如php引擎編譯的時候也會用到。
3、nginx-rtmp-module原始碼包
這才rtmp服務真正要的工具。
4、openssl原始碼包。這個不是必須。只有nginx 版本在1.3.14 - 1.5.0之間的,才需要安裝。nginx-rtmp-module的文件特意提到了這點。
在編譯nginx的時候,加上引數--with-http_ssl_module。如:./configure --add-module=rtmp模組的原始碼位置
二、編譯nginx
解壓nginx。進入到nginx原始碼目錄,執行如下命令:
第一步:
./configure --prefix=nginx安裝到哪個目錄
--with-pcre=pcre庫的原始碼目錄,注意是原始碼目錄
--add-module=rtmp模組的原始碼目錄
注:預先將pcre庫、rtmp模組解壓。以便上面使用。
一般兩種壓縮包。命令不同,如下:
tar.gz包命令:tax -xzvf 軟體包
zip包:unzip 軟體包
第二步:
make && make install
三、配置nginx
配置nginx.conf,增加rtmp與http是同級別的,內容如下:
user root; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log error; pid logs/nginx.pid; events { worker_connections 1024; } #服務於rtmp協議的請求 rtmp://開頭 rtmp{ server{ listen 1395; chunk_size 4096; #自定義的直播名稱,路徑中將會用到 #rtmp://192.168.56.88:1395/my_live/rtmpstream中的my_live就是下面定義的名稱 application my_live{ #開啟直播功能 live on;
#接收的rtmp視訊流是否落地儲存到flv檔案,不開啟就直接在記憶體中,儲存也是一個視訊拆成很多小flv檔案 record all; #儲存路徑 record_path /tmp/nginx_rtmp_av; record_max_size 128K; #為同一個視訊檔案的視訊分片加時間戳 record_unique on; }
#hls協議,一樣是一個application後面接著自定義名稱,區別是hls on;
application hls {
live on;
#開啟hls
hls on;
#hls的視訊分片檔案(.ts)存放路徑
hls_path /tmp/nginx_hls_av;
#每個視訊分片檔案包含多少秒
hls_fragment 5s;
#是否清理掉舊的ts檔案。預設是開啟的。現在關閉
hls_cleanup off;
hls_playlist_length 5h;
}
} #這裡可以加其他server偵聽其他埠 } #服務於http請求 http{ }
注:nginx-rtmp-module在nignx.conf中使用的指令有很多,需要慢慢消化。先搭建一個簡單的骨架。比如還可以進行hls協議的服務。
使用指令的說明文件:https://github.com/arut/nginx-rtmp-module/wiki/Directives
四、推流和拉流
怎麼推流
使用ffmpeg工具來推流。Ffmpeg是一套開源的庫:視訊採集功能、視訊格式轉換、視訊抓圖、給視訊加水印。很多軟體引入了這個庫來完成視訊的採集、轉碼。
命令格式如下:
ffmpeg -re -i E:\test.mp4 -f flv rtmp://192.168.56.88:1395/my_live/rtmpstream
上述命令,就會讀取-i引數指定的視訊檔案,推流到指定地址去。需要將ffmpeg新增到環境變數中去。或者直接輸入ffmpeg的完整安裝路徑來執行也是可以的。
其中,my_live是nginx.conf中配置的直播名稱。rtmpstream是自定義的名稱。後續拉流的時候,就必須使用這個名稱來拉流,nginx-rtmp落地儲存資料(若開啟了)的時候,就是使用這個名稱命名flv檔案的。如一個視訊檔案才伺服器磁碟上被拆成了:rtmpstream-1502794875.flv、rtmpstream-1502794879.flv、rtmpstream-1502794885.flv.................。
-r設定幀速率,預設為25。
-i 設定輸入流,也就是讀取哪個檔案推流到服務端。
執行命令後,會在命令列看到推流過程:
客戶端使用ffmpeg完成視訊的推流,接著可以在另外一端,輸入拉流地址,拉流觀看視訊。
怎麼拉流觀看視訊
需要一個很常用的流媒體工具:VLC。
軟體安裝好後(筆者安裝的是window下VLC工具),開啟軟體,選擇"開啟網路串流",如下所示:
輸入拉流的地址,推流和拉流都是同一個地址(說的是rtmp協議)。如:rtmp://192.168.56.88:1395/my_live/rtmpstream
到此,完成了,一邊推流,一邊拉流的效果。
特別注意:
使用hls方式來推流給nginx,客戶端ffmpeg的引數要不一樣了:需要增加兩個引數-vcodec copy和-acodec copy。如果沒有這兩個引數,是不會把視訊落地到hls對應的目錄去的。
如下:
ffmpeg -re -i E:\test.mp4 -vcodec copy -acodec copy -f flv rtmp://192.168.56.88:1395/hls/hls_stream
-acodec表示音訊編碼,copy表示不改變編解碼器,只是改封裝器。
-vcodec表示視訊編碼,copy表示不改變編解碼器,只是改封裝器。