FFmpeg開發筆記(四十三)使用SRS開啟SRT協議的影片直播服務

aqi00發表於2024-08-03
《FFmpeg開發實戰:從零基礎到短影片上線》一書在第10章介紹了輕量級流媒體伺服器MediaMTX,透過該工具可以測試RTSP/RTMP等流媒體協議的推拉流。不過MediaMTX的功能實在是太簡單了,無法應用於真實直播的生產環境,真正能用於生產環境的流媒體伺服器還要看SRS或者ZLMediaKit。

SRS是一款國產的開源流媒體伺服器,支援RTMP、SRT等主流直播協議,它的安裝說明參見之前的文章《Linux環境安裝SRS實現影片推流》。結合SRS與ffmpeg實現RTMP協議的推流功能,已在《Linux環境安裝SRS實現影片推流》一文中詳細介紹,這裡單獨講解如何透過SRS與ffmpeg實現SRT協議的推流功能。
SRS在編譯和啟動的時候已經預設支援SRT,檢視SRS專用於SRT服務的配置檔案srt.conf,找到srt部分的配置資訊如下,可見SRS預設把10080埠分配給SRT協議。

srt_server {
    enabled on;
    listen 10080;
    maxbw 1000000000;
    connect_timeout 4000;
    peerlatency 0;
    recvlatency 0;
    latency 0;
    tsbpdmode off;
    tlpktdrop off;
    sendbuf 2000000;
    recvbuf 2000000;
}

除此以外,還需在srt.conf的“vhost __defaultVhost__”節點內部新增下面一行:

gop_cache   on;

該行配置的作用是開啟快取關鍵幀,實際應用記得設定為on,否則客戶端拉流找不到關鍵幀就無法渲染畫面。
接著執行下面命令即可啟動專用於SRT協議的SRS流媒體伺服器。

cd /usr/local/src/srs/trunk
./objs/srs -c conf/srt.conf &

在SRS啟動之後,執行下面的ffmpeg命令即可將影片檔案向SRT地址推流。注意,務必確保Linux伺服器上的FFmpeg已經整合了libsrt庫,否則ffmpeg無法向srt地址推流,詳細的整合步驟參見之前的文章《Linux環境給FFmpeg整合libsrt和librist》。

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/cctv5.ts" -c copy -f mpegts 'srt://127.0.0.1:10080?streamid=#!::r=live/test,m=publish'

注意,上面命令中的srt地址後半段為“r=live/test,m=publish”,其中“r=live/test”表示SRT的服務名稱叫做“live/test”,而“m=publish”表示該地址屬於釋出功能也就是給推流方使用。
SRS對影片原始檔的封裝格式也有要求,不僅要求原始檔為ts格式,還要求推流格式也為ts格式,所以ffmpeg命令中新增了“-f mpegts”表示轉換成mpeg的ts流格式。如果原始檔不是ts格式,或者沒轉成mpegts格式,後續透過ffplay播放srt連結都會報下面的錯誤。

non-existing PPS 0 referenced

執行ffmpeg的SRT推流命令之後,SRS輸出以下的日誌資訊,可見其SRT推流功能正常執行。

[x7gy1tv8] SRT client ip=127.0.0.1:58898, fd=237547294
[x7gy1tv8] @srt, streamid=#!::r=live/test,m=publish, stream_url=/live/test, vhost=__defaultVhost__, app=live, stream=test, param=
[x7gy1tv8] new srt source, stream_url=/live/test
[x7gy1tv8] new live source, stream_url=/live/test
[x7gy1tv8] ignore disabled exec for vhost=__defaultVhost__
[x7gy1tv8] http: mount flv stream for sid=/live/test, mount=/live/test.flv

然後按照《FFmpeg開發實戰:從零基礎到短影片上線》一書“1.3 Windows系統安裝FFmpeg”的介紹,在個人電腦上安裝FFmpeg並開啟MSYS的命令列,執行下面的ffplay命令,期望從SRT地址拉流播放。注意,務必確保電腦上的FFmpeg已經整合了libsrt庫,否則ffplay無法播放srt連結,詳細的整合步驟參見之前的文章《Windows環境給FFmpeg整合libsrt》。

ffplay -i 'srt://124.xxx.xxx.xxx:10080?streamid=#!::r=live/test,m=request'

上面的SRT拉流地址與之前的推流地址大同小異,除了把內網IP換成外網IP之外,就是把連結末尾的“m=publish”改成了“m=request”,其中request表示請求也就是用於拉流方。
ffplay執行後彈出播放器視窗,正常播放影片畫面和聲音。同時觀察SRS的服務日誌如下所示:

[3p39n49z] SRT client ip=112.5.138.145:51436, fd=237547293
[3p39n49z] @srt, streamid=#!::r=live/test,m=request, stream_url=/live/test, vhost=__defaultVhost__, app=live, stream=test, param=
[3p39n49z] create ts consumer, no gop cache

從以上日誌可見,SRS透過SRT協議成功實現了影片直播的SRT推拉流功能。

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

相關文章