概述
流媒體服務器作為直播畫面的中轉站,它接收推流端的相機畫面,同時拉流端找它獲取相機的畫面。整個流程如下:
- 在流媒體服務器上創建流媒體應用(app),一個流媒體服務器上面可以創建多個流媒體應用
- 約定推拉流的地址。假設流媒體服務器工作在1935端口上面,假設創建的流媒體應用的唯一標識為 live01,那么我們可以約定推拉流地址為 rtmp://ip:1935/live01/{camera_id} ,其中camera_id 為唯一標識,用于區分每一個相機 。針對相機A的推拉流地址可以為:rtmp://ip:1935/live01/camera-A,同理針對相機B的推拉流地址可以為:rtmp://ip:1935/live01/camera-B
- 推流端向 推拉流地址 推送直播流
- 拉流端從 推拉流地址 拉取直播流播放
出于技術調研的目的,將使用OBS作為上述流程中的推流端;將使用Nginx作為上述流程中的流媒體服務器;將使用ffplay、VLC、flv.js作為上述流程中的拉流端。那么整個流程的落地實踐就變成了:
- 使用Nginx搭建流媒體服務器,需要基于源碼編譯 nginx-http-flv-module 模塊
- 在nginx.conf 中創建媒體應用,并做相應的配置,包括對hls(即m3u8)的支持,http-flv的支持
- 約定推拉流的地址
- OBS向推拉流地址推送流
- ffplay拉取直播畫面并播放,rtmp協議
- VLC拉取直播畫面并播放,rtmp協議、hls協議
- 使用基于flv.js 的視頻播放器播放直播畫面,http協議
基于源碼編譯安裝nginx-http-flv-module
參考之前寫的:使用Nginx搭建流媒體服務器
創建流媒體應用
當安裝好了 nginx-http-flv-module 之后,就可以創建流媒體應用了。
所謂的創建流媒體應用其實就是編寫 nginx 的配置文件,如果需要創建一個名為live 的流媒體應用,那么可以在nginx.conf 中做如下配置:
# 以下內容放可在 nginx.conf 的最后,rtmp 配置塊為頂級配置塊
rtmp_auto_push on ;rtmp {server {listen 1935; #監聽的端口notify_method get;chunk_size 4000;application live { #rtmp推流請求路徑live on;# 添加 hls 支持hls on;hls_path /usr/local/nginx/html/hls;hls_fragment 3;hls_playlist_length 60;# 允許從任何源push 流allow publish all ;# 允許從任何地方來播放流allow play all;# 20s內沒有push,就斷開連接drop_idle_publisher 20s ;}}
}
- listen 1935:指定流媒體服務器的運行端口
- live :為流媒體應用的應用的名稱,也即流媒體應用的唯一標識
- live on : 添加直播的支持
- hls_path:指定生成的m3u8文件的位置
創建http-flv端點和hls端點
創建http-flv端點和hls端點的目的是讓直播流可以在http協議上面傳輸直播畫面。
若不創建,將僅可以使用rtmp協議拉流,即rtmp://ip:1935/live/stream_no;若創建了就可以使用hls或者flvjs來拉流播放了。
創建http-flv端點和hls端點同樣是編輯nginx.conf來實現,如下示例配置:
http {......server {listen 82;server_name rtmpserver;# 創建hls端點location /hls {add_header 'Access-Control-Allow-Origin' '*' ;add_