FFmpeg開發筆記(四十一)結合OBS與MediaMTX實現SRT直播推流

aqi00發表於2024-07-27
《FFmpeg開發實戰:從零基礎到短影片上線》一書的“10.2 FFmpeg推流和拉流”提到直播行業存在RTSP和RTMP兩種常見的流媒體協議。除此以外,還有於2017年推出的SRT協議,相比常見的RTMP協議,SRT協議具有更低的延遲,並且消除了卡幀、抖動等破圖現象。騰訊影片雲已經引入了SRT協議,在實踐中取得了良好的影片直播效果。

FFmpeg從4.0開始支援整合第三方的libsrt庫,該庫為SRT協議的支援庫。OBS Studio、MediaMTX等開源軟體也紛紛支援SRT,國產的兩個開源流媒體伺服器SRS和ZLMediaKit都支援SRT協議,可見在直播領域SRT取代RTMP已是大勢所趨。在本文的直播操作之前,務必確保電腦上的FFmpeg已經整合了libsrt庫,詳細的整合步驟參見之前的文章《Windows環境給FFmpeg整合libsrt》。
下面就以Windows環境為例,把OBS Studio作為SRT直播的錄製推流方,把MediaMTX作為承載SRT直播的流媒體伺服器,把ffplay和VLC media player作為SRT直播的拉流播放器,演示看看如何在個人電腦搭建一個從錄製到分發到播放的完整SRT直播系統。
首先按照《FFmpeg開發實戰:從零基礎到短影片上線》一書“10.2.2 FFmpeg向網路推流”的介紹,安裝並啟動MediaMTX,彈出的MediaMTX日誌視窗顯示內容如下:

2023/12/10 14:18:25 INF MediaMTX v1.3.0
2023/12/10 14:18:25 INF configuration loaded from E:\Program Files (x86)\mediamtx\mediamtx.yml
2023/12/10 14:18:25 INF [RTSP] listener opened on :8554 (TCP), :8000 (UDP/RTP), :8001 (UDP/RTCP)
2023/12/10 14:18:25 INF [RTMP] listener opened on :1935
2023/12/10 14:18:25 INF [HLS] listener opened on :8888
2023/12/10 14:18:25 INF [WebRTC] listener opened on :8889 (HTTP), :8189 (ICE/UDP)
2023/12/10 14:18:25 INF [SRT] listener opened on :8890 (UDP)

從上面日誌可見,MediaMTX提供的SRT服務正在監聽8890埠,且該服務採用UDP傳輸層協議。此時SRT服務的訪問地址字首為srt://127.0.0.1:8890?streamid=xxx,開頭的“srt://”表示該地址採用srt協議,後面的“127.0.0.1:8890”為SRT服務的IP和埠號。再後面的“?streamid=xxx”表示SRT服務的流名稱,其中xxx為形如“action:path”格式的字串,冒號前面的action有兩個取值,為publish表示推流方,為read表示拉流方;冒號後面的path表示播放地址的路徑名稱。
接著啟動OBS Studio,單擊主介面右下角的“設定”按鈕,彈出的設定視窗在左邊列表選擇“直播”,視窗右邊的“服務”欄選擇“自定義”,“伺服器”欄填“srt://127.0.0.1:8890?streamid=publish:live”,如下圖所示:

設定好SRT伺服器地址後,按照之前文章《使用OBS Studio開啟RTMP直播推流》的說明,讓OBS Studio開啟影片直播推流,觀察MediaMTX的服務日誌如下所示:

2023/12/10 14:18:59 INF [SRT] [conn 127.0.0.1:50021] opened
2023/12/10 14:19:01 INF [SRT] [conn 127.0.0.1:50021] is publishing to path 'live', 2 tracks (H264, MPEG-4 Audio)

可見MediaMTX的SRT服務正在把推流方的音訊流和影片流釋出到live路徑。
然後按照《FFmpeg開發實戰:從零基礎到短影片上線》一書“1.3 Windows系統安裝FFmpeg”的介紹,在個人電腦上安裝FFmpeg並開啟MSYS的命令列,執行下面的ffplay命令,期望從SRT地址拉流播放。

ffplay -i 'srt://127.0.0.1:8890?streamid=read:live'

此時ffplay彈出播放器視窗,正常播放影片畫面和聲音。同時觀察MediaMTX的服務日誌如下所示:

2023/12/10 14:19:40 INF [SRT] [conn 127.0.0.1:53466] opened
2023/12/10 14:19:40 INF [SRT] [conn 127.0.0.1:53466] is reading from path 'live', 2 tracks (H264, MPEG-4 Audio)

可見作為拉流方的ffplay正在從SRT服務的live路徑拉取音訊流和影片流,說明MediaMTX透過SRT協議成功實現了影片直播的SRT推拉流功能。
最後開啟VLC media player,依次選擇選單:“媒體”——“開啟網路串流”,在URL位址列填入SRT服務的拉流連結“srt://127.0.0.1:8890?streamid=read:live”,單擊視窗右下角的播放按鈕,即可使用VLC media player播放SRT直播地址了。

更多詳細的FFmpeg開發知識參見《FFmpeg開發實戰:從零基礎到短影片上線》一書。


相關文章