一、前言
目前,全球直播帶貨什麼的,成為主流,那如何自己搭建一個直播伺服器呢。
首先需要一個流媒體伺服器,搭建流媒體有很多種方式,如下:
- 流媒體解決方案 Live555 (C++)
- 流媒體平台架構 EasyDarwin (C++,國産精品)
- 實時流媒體播放伺服器程式DarwinStreamingSrvr (C++)
- Flash流媒體伺服器 Red5 (Java)
- 流媒體伺服器 Open Streaming Server (Java)
- FMS流媒體伺服器 (Adobe,收費的)
- Wowza流媒體伺服器(Java)
- 開源流媒體平台FreeCast(Java)
- Ngix+RTMP插件
- SRS+OBS
- 這裡介紹國産開源流媒體伺服器 SRS 的搭建及使用。
1.SRS簡介
SRS(Simple Realtime Server)是一個簡單高效的實時視訊伺服器, 是國人寫的一款非常優秀的開源流媒體伺服器軟體,可用于直播/錄播/視訊客服等多種場景,其定位是營運級的網際網路直播伺服器叢集。
支援RTMP/WebRTC/HLS/HTTP-FLV/SRT/GB28181。
官方網站:http://ossrs.net/lts/zh-cn/
目前版本為SRS4,屬于穩定版,可用于生産環境
2.SRS安裝
官方文檔:http://ossrs.net/lts/zh-cn/docs/v4/doc/getting-started
安裝主要有docker和源碼安裝,兩種方式,都很簡單。
官方推薦使用Docker啟動SRS,這是最簡單也是最友善的方式。 由于後續有些内容經常需要動到配置檔案,是以我這裡選擇用源碼安裝的方式。
1:下載下傳源碼git clone -b 4.0release https://gitee.com/ossrs/srs.git
2:編譯,注意需要切換到srs/trunk目錄
cd srs/trunk ./configure make
3:啟動伺服器
./objs/srs -c conf/srs.conf
4:檢查伺服器狀态 檢查SRS是否成功啟動,可以打開 http://localhost:8080/ ,如我這裡伺服器位址為:192.168.152.100。是以浏覽器輸入:http://192.168.152.100:8080/即可通路。
當然,也可以用指令檢查伺服器狀态。
./etc/init.d/srs status
或者看SRS的日志
tail -n 30 -f ./objs/srs.log
如下圖,看到下面提示為正常啟動。
SRS(pid 29588) is running. [ OK ]
三、OBS推流RTMP
推流可以選擇FFmpeg或者OBS,如果對FFmpeg指令比較熟,可以選擇這個,占用資源更少。
我這裡選擇OBS,因為界面話更友好直覺。
OBS下載下傳位址:https://obsproject.com/download
1:直播畫面選擇
在來源+中,選擇要推送的畫面,如果有攝像頭或者錄影機,則添加“視訊采集裝置”,然後選擇相應的攝像頭名稱即可。
我這裡沒攝像頭,選擇自己的電腦桌面直播推送,及“顯示器采集”。
2:設定流媒體伺服器
在右下方的 設定 >> 推流 >> 服務 >> 自定義。
填寫流媒體伺服器位址,我這裡是: rtmp://192.168.152.100/live/ 串流密鑰随便填寫即可,這裡我填寫的是:test-livestream。 是以最後播放位址為:rtmp://192.168.152.100/live/test-livestream
3:推送直播畫面
配置完成後,點選 “開始推流” 即可推送畫面。沒有報錯,說明推送成功,同時下方會有相關資訊,如cpu之類的。
在浏覽器 http://192.168.152.100:8080/ 打開控制台,可以看到推送的流資訊。
點選預覽,可以看到,剛才的推送畫面了。後面加flv,是因為推流拉流都是用的RTMP。 是以RTMP流的播放位址為:rtmp://192.168.152.100/live/test-livestream.flv
4:VLC 播放器
VCL是一個很強大的播放器,支援播放網絡串流。
是以可以直接用VCL播放測試。
下載下傳位址:https://www.videolan.org/index.an.html
下載下傳安裝後,打開 媒體 >> 打開網絡串流,輸入播放位址即可觀看直播畫面。
四、RTMP低延時配置
以上基本的直播推流拉流,配置完成。但是測試,延遲還是很大。
根據直播畫面和本地時間對比,可以發現延遲差不多有6秒左右,不是很正常。RTMP流,正常延遲時間為1到3秒左右,是以還需要配置。
1:預設配置檔案
由于我們以預設的配置檔案啟動,即srs.conf 這個配置檔案。預設配置檔案如下:
``` ubuntu@ubuntu:~/srs/trunk$ cat conf/srs.confmain config for srs.@see full.conf for detail config.listen 1935; max_connections 1000;srslogtank file;srslogfile ./objs/srs.log;daemon on; httpapi { enabled on; listen 1985; } httpserver { enabled on; listen 8080; dir ./objs/nginx/html; } rtcserver { enabled on; listen 8000; # UDP port # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate candidate $CANDIDATE; } vhost defaultVhost { hls { enabled on; } httpremux { enabled on; mount [vhost]/[app]/[stream].flv; } rtc { enabled on; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc rtmptortc off; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp rtctortmp off; } }
```
2:更改配置檔案
根據官方文檔,可以更改配置檔案,低延遲配置,在vhost __ defaultVhost __ 添加以下配置。具體原理可以參考官方文檔。
``` tcpnodelay on; minlatency on;
play {
gop_cache off;
queue_length 10;
mw_latency 100;
}
publish {
mr off;
}```最終配置檔案為:``` listen 1935; max_connections 1000;srslogtank file;srslogfile ./objs/srs.log;daemon on; httpapi { enabled on; listen 1985; } httpserver { enabled on; listen 8080; dir ./objs/nginx/html; } rtcserver { enabled on; listen 8000; # UDP port # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate candidate $CANDIDATE; } vhost defaultVhost { hls { enabled on; } httpremux { enabled on; mount [vhost]/[app]/[stream].flv; } rtc { enabled on; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc rtmptortc off; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp rtctortmp off; } tcpnodelay on; minlatency on;play {
gop_cache off;
queue_length 10;
mw_latency 100;
}
publish {
mr off;
}}```
3:重載配置檔案測試
配置完成後,reload重載配置,完成。
./etc/init.d/srs reload
然後再次用obs推流拉流,檢視效果,延遲為2秒左右,在正常延遲範圍内。
五、RTMP推流webRTC拉流(RTMP to RTC)
上面測試有2秒的延遲,有沒有更低延遲呢。有,就是webRTC。
webRTC起初用于視訊會議等及時通訊,現在越來越成熟,應用也越多,正常延遲為1秒之内。
1:更改配置檔案 預設配置檔案,有rtc的選項,是打開的,我們是RTMP to RTC,是以還需要把rtmptortc off 改成 rtmptortc on,即可。
``` rtc { enabled on; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtmp-to-rtc rtmptortc on; # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#rtc-to-rtmp rtctortmp off; }```
還有重要的一點,rtc_server裡的candidate配置。如果是伺服器是雲伺服器之類的。必須将 $CANDIDATE 更改為公網IP,或者0.0.0.0(任何IP可通路)。我這裡内網測試,是以無需更改。
rtc_server { enabled on; listen 8000; # UDP port # @see https://ossrs.net/lts/zh-cn/docs/v4/doc/webrtc#config-candidate candidate $CANDIDATE; }
C++音視訊學習資料免費擷取方法:關注音視訊開發T哥,點選「連結」即可免費擷取2023年最新C++音視訊開發進階獨家免費學習大禮包!
2:重載配置測試
./etc/init.d/srs reload
由于vcl不支援webRTC格式串流,是以直接用控制台自動的webRTC播放器檢視。 播放位址為:webrtc://192.168.152.100/live/test-livestream
同時打開直播畫面和本地畫面。
可以看到延遲在1秒之内,基本在500毫秒左右。
六、HLS流
HLS流,作為直播正常延遲10秒起步,是以也不推薦使用。如果要配置。 隻需在預設配置檔案中,添加如下即可,原來隻有一行
enabled on;``` hls { enabled on; hlspath ./objs/nginx/html; hlsfragment 10; hls_window 60; }```
重載配置後,可用vcl播放器位址:http://192.168.152.100:8080/live/test-livestream.m3u8
延遲太大,可自行測試。
七、DVR錄制
OBS也可以直接錄制,但是有些需求,需要在伺服器上直接錄制檔案,如API需求,是以在伺服器開啟DVR即可。
1:更改配置檔案 SRS支援将RTMP流錄制成FLV或MP4檔案。 DVR作為SRS3的核心功能,永遠開啟DVR,隻需要在配置檔案的 vhost defaultVhost 加入以下内容即可
``` dvr { enabled on; dvrapply all; dvrplan segment; dvrpath ./objs/nginx/html/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].mp4; dvrduration 30; dvrwaitkeyframe on; time_jitter full; }```
參數說明:
dvrapply :DVR的apply決定了是否對某個流開啟dvr,預設的all是對所有開啟
dvrplan :可配置session和segment,session就是推流到停止推流為整段視訊儲存,dvrduration參數不生效。segment為分段報錯,和dvrduration、dvrwaitkeyframe搭配使用。
dvrduration:錄制每個片段時常,如30,為30秒一個片段。
dvrwaitkeyframe:按關鍵幀切。
timejitter: 時間戳抖動算法。full使用完全的時間戳矯正;zero隻是保證從0開始;off不矯正時間戳。
dvrpath :檔案報錯路徑及指令方式。
自定義DVR的路徑和檔案名 以上預設即可,
主要參數: dvrpath 按自己需要改格式。
1:沒有變量,SRS1.0方式(自動添加[stream].[timestamp].flv作為檔案名):
dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
生成的檔案名及路徑:
./objs/nginx/html/live/livestream.1420254068776.flv; ```
2:按流和年月日分目錄,時間作為檔案名
``` dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]/[15].[04].[05].[999].flv;
生成的檔案名及路徑:
./objs/nginx/html/live/livestream/2015/01/03/10.57.30.776.flv; ```
3:按流和年月分目錄,日和時間作為檔案名:
``` dvr_path ./objs/nginx/html/[app]/[stream]/[2006]/[01]/[02]-[15].[04].[05].[999].flv;
生成的檔案名及路徑:
./objs/nginx/html/live/livestream/2015/01/03-10.57.30.776.flv; ```
4:按vhost/app和年月分目錄,流名稱、日和時間作為檔案名:
``` dvr_path ./objs/nginx/html/[app]/[2006]/[01]/[stream]-[02]-[15].[04].[05].[999].flv;
生成的檔案名及路徑:
./objs/nginx/html/live/2015/01/livestream-03-10.57.30.776.flv; ```
5:按app分目錄,流和時間戳作為檔案名(SRS1.0方式):
``` dvr_path ./objs/nginx/html/[app]/[stream].[timestamp].flv;
生成的檔案名及路徑:
./objs/nginx/html/live/livestream.1420254068776.flv; ```
如果需要錄制MP4格式的,就把flv字尾,改成mp4即可。
3:檢視錄制的檔案
改成後重載配置
./etc/init.d/srs reload
過一段時間,可以在./objs/nginx/html/live/2022/09/ 看到生成的檔案。
下載下傳任意一個檔案,播放可以看到錄制的時間30秒左右。
4:Http Callback
伺服器端定制的實作方式,就是HTTP回調。如需要api回調的方式擷取dvr,在配置檔案加入以下即可。
http_hooks { enabled on; on_dvr http://127.0.0.1:8085/api/v1/dvrs; }
更詳細的可自行參考官方文檔:HTTP Callback
八、小結
以上基本的使用及搭建就完成了,如果還需要功能可自行參考官方文檔。
引用官方的那句話:
對于新手來說,音視訊的門檻真的非常高,SRS的目标是降低(不能消除)音視訊的門檻,是以請一定要讀完Wiki:https://ossrs.net/lts/zh-cn/docs/v4/doc/introduction
作者:「the丶only」
原文連結:https://blog.csdn.net/weixin_52270081/article/details/126965944
#音視訊開發##把地球的故事講給宇宙#