天天看點

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

作者:音視訊開發T哥

一、前言

目前,全球直播帶貨什麼的,成為主流,那如何自己搭建一個直播伺服器呢。

首先需要一個流媒體伺服器,搭建流媒體有很多種方式,如下:

  1. 流媒體解決方案 Live555 (C++)
  2. 流媒體平台架構 EasyDarwin (C++,國産精品)
  3. 實時流媒體播放伺服器程式DarwinStreamingSrvr (C++)
  4. Flash流媒體伺服器 Red5 (Java)
  5. 流媒體伺服器 Open Streaming Server (Java)
  6. FMS流媒體伺服器 (Adobe,收費的)
  7. Wowza流媒體伺服器(Java)
  8. 開源流媒體平台FreeCast(Java)
  9. Ngix+RTMP插件
  10. SRS+OBS
  11. 這裡介紹國産開源流媒體伺服器 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 ]

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

三、OBS推流RTMP

推流可以選擇FFmpeg或者OBS,如果對FFmpeg指令比較熟,可以選擇這個,占用資源更少。

我這裡選擇OBS,因為界面話更友好直覺。

OBS下載下傳位址:https://obsproject.com/download

1:直播畫面選擇

在來源+中,選擇要推送的畫面,如果有攝像頭或者錄影機,則添加“視訊采集裝置”,然後選擇相應的攝像頭名稱即可。

我這裡沒攝像頭,選擇自己的電腦桌面直播推送,及“顯示器采集”。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

2:設定流媒體伺服器

在右下方的 設定 >> 推流 >> 服務 >> 自定義。

填寫流媒體伺服器位址,我這裡是: rtmp://192.168.152.100/live/ 串流密鑰随便填寫即可,這裡我填寫的是:test-livestream。 是以最後播放位址為:rtmp://192.168.152.100/live/test-livestream

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

3:推送直播畫面

配置完成後,點選 “開始推流” 即可推送畫面。沒有報錯,說明推送成功,同時下方會有相關資訊,如cpu之類的。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

在浏覽器 http://192.168.152.100:8080/ 打開控制台,可以看到推送的流資訊。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

點選預覽,可以看到,剛才的推送畫面了。後面加flv,是因為推流拉流都是用的RTMP。 是以RTMP流的播放位址為:rtmp://192.168.152.100/live/test-livestream.flv

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

4:VLC 播放器

VCL是一個很強大的播放器,支援播放網絡串流。

是以可以直接用VCL播放測試。

下載下傳位址:https://www.videolan.org/index.an.html

下載下傳安裝後,打開 媒體 >> 打開網絡串流,輸入播放位址即可觀看直播畫面。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置
搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

四、RTMP低延時配置

以上基本的直播推流拉流,配置完成。但是測試,延遲還是很大。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

根據直播畫面和本地時間對比,可以發現延遲差不多有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秒左右,在正常延遲範圍内。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

五、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

同時打開直播畫面和本地畫面。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

可以看到延遲在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/ 看到生成的檔案。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

下載下傳任意一個檔案,播放可以看到錄制的時間30秒左右。

搭建自己的直播流媒體伺服器SRS,以及SRS+OBS直播推拉流使用配置

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

#音視訊開發##把地球的故事講給宇宙#

繼續閱讀