不管是傳統互聯網還是移動互聯網,實時數據傳輸都是剛需,比如以QQ、微信為代表的即時通信工具,能夠實時傳輸文本和圖片。其中一對一的圖文通信叫做私聊,多對多的圖文通信叫做群聊。 除了常見的圖文即時通信,還有實時音視頻通信,比如一對一的音頻通話、一對一的視頻通話等等,此時可採用WebRTC技術,有關We ...
不管是傳統互聯網還是移動互聯網,實時數據傳輸都是剛需,比如以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開發知識參見