FFmpeg開發筆記(四十六)利用SRT協議構建手機APP的直播Demo

aqi00發表於2024-08-11
不管是傳統網際網路還是移動網際網路,實時資料傳輸都是剛需,比如以QQ、微信為代表的即時通訊工具,能夠實時傳輸文字和圖片。其中一對一的圖文通訊叫做私聊,多對多的圖文通訊叫做群聊。

除了常見的圖文即時通訊,還有實時音影片通訊,比如一對一的音訊通話、一對一的視訊通話等等,此時可採用WebRTC技術,有關WebRTC的程式設計開發及其專案實戰參見《Android Studio開發實戰:從零基礎到App上線(第3版)》的第20章“20.2 給App整合WebRTC”。
但是一對多的線上直播採用WebRTC技術就不太合適了,因為WebRTC只管打洞把雙方的網路打通,不考慮綜合負載。一旦連線WebRTC的裝置多起來,整個WebRTC網路就會癱瘓。那麼一對多的線上直播就要考慮部署獨立的流媒體伺服器,透過專門的流媒體傳輸協議,處理媒體源的音影片格式轉換,以及音訊流和影片流的資料分發工作。更多詳細的FFmpeg開發知識參見《FFmpeg開發實戰:從零基礎到短影片上線》一書。

一、常見的四種流媒體傳輸協議對比

常見的流媒體傳輸協議主要有下面四類:RTSP協議、RTMP協議、SRT協議和RIST協議,關於這四種協議的詳細說明參見之前的文章《利用RTMP協議構建電腦與手機的直播Demo》,這裡不再贅述。
總的來說,雖然SRT協議出現時間較晚,但是它的直播質量大大優於RTMP協議,今後必將成為國內直播領域主流的流媒體協議。下面就以SRT協議為例,介紹如何透過OBS Studio和SRT Streamer向流媒體伺服器做SRT直播推流。

二、電腦端透過OBS Studio進行SRT直播推流

首先啟動電腦上的流媒體伺服器MediaMTX,具體的操作步驟詳見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“10.2 FFmpeg推流和拉流”,也可參考之前的文章《詳解MediaMTX的推拉流》。
接著啟動電腦上的直播錄製軟體OBS Studio,具體的操作步驟詳見之前的文章《結合OBS與MediaMTX實現SRT直播推流》。之後讓OBS Studio對MediaMTX的srt地址“srt://127.0.0.1:8890?streamid=publish:live”推流,推流過程的OBS Studio錄製介面如下圖所示。

然後啟動電腦上的流媒體播放器VLC media player,開啟網路串流“srt://127.0.0.1:8890?streamid=read:live”,此時VLC media player的影片播放介面如下圖所示。

結合OBS Studio的直播錄製畫面和VLC media player的直播觀看介面,可知透過OBS Studio成功實現了SRT協議的直播功能。

三、手機端透過SRT Streamer進行SRT直播推流

首先啟動雲服務上的流媒體伺服器SRS或者ZLMediaKit,在雲伺服器上部署和啟動SRS或者ZLMediaKit比較麻煩,三言兩語說不清楚。如果大家想弄明白如何在雲伺服器上操作SRS或者ZLMediaKit,可在京東自營購買《FFmpeg開發實戰:從零基礎到短影片上線》一書,聯絡作者諮詢這兩個流媒體伺服器在雲伺服器上的詳細執行過程。
接著啟動手機上的直播錄製軟體SRT Streamer,具體的操作步驟詳見之前的文章《使用SRT Streamer開啟APP直播推流》。SRT Streamer啟動後,點選螢幕下方的“Start Live”按鈕,讓SRT Streamer對ZLMediaKit的srt地址“srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=publish”推流,推流過程的SRT Streamer錄製介面如下圖所示。

觀察華為雲上的ZLMediaKit日誌如下,可見SRT Streamer正在向後端的流媒體伺服器推送直播流:

[MediaServer] [685314-event poller 0] SrtSession.cpp:103 onRecv | 1-11(223.104.51.155:11372) 
[MediaServer] [685314-event poller 0] SrtTransportImp.cpp:166 operator() | test(223.104.51.155:11372) 允許 srt 推流
[MediaServer] [685314-event poller 0] Decoder.cpp:143 onTrack | Got track: H264
[MediaServer] [685314-event poller 0] Decoder.cpp:143 onTrack | Got track: mpeg4-generic
[MediaServer] [685314-event poller 0] Decoder.cpp:97 onStream | Add track finished
[MediaServer] [685314-event poller 0] MediaSink.cpp:161 emitAllTrackReady | All track ready use 15ms
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒體註冊:fmp4://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MultiMediaSourceMuxer.cpp:551 onAllTrackReady | stream: schema://__defaultVhost__/app/stream , codec info: mpeg4-generic[44100/2/16] H264[720/1280/0] 
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒體註冊:rtmp://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒體註冊:rtsp://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒體註冊:ts://__defaultVhost__/live/test
[MediaServer] [685314-event poller 0] MediaSource.cpp:517 emitEvent | 媒體註冊:hls://__defaultVhost__/live/test

然後啟動電腦上的流媒體播放器VLC media player,開啟網路串流“srt://124.xxx.xxx.xxx:9000?streamid=#!::r=live/test,m=request”,此時VLC media player的影片播放介面如下圖所示。

觀察華為雲上的ZLMediaKit日誌如下,可見VLC media player正在從後端的流媒體伺服器拉取直播流:

[MediaServer] [576478-event poller 0] SrtSession.cpp:103 onRecv | 2-16(112.5.138.145:57022) 
[MediaServer] [576478-event poller 0] SrtTransport.cpp:731 onShutdown | peer close connection
[MediaServer] [576478-event poller 0] SrtSession.cpp:118 onError | 2-16(112.5.138.145:57022) 6(peer close connection)
[MediaServer] [576478-event poller 0] SrtTransportImp.cpp:14 ~SrtTransportImp | test(112.5.138.145:57022) srt 播放器(__defaultVhost__/live/test)斷開,耗時(s):16

結合SRT Streamer直播錄製畫面和VLC media player的直播觀看介面,可知透過SRT Streamer成功實現了SRT協議的直播功能。

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

相關文章