FFmpeg開發筆記(四十八)從0開始搭建直播系統的開源軟體架構

aqi00發表於2024-08-18
音影片技術的一個主要用途是直播,包括電視直播、電腦直播、手機直播等等,甚至線上課堂、線上問診、安防監控等應用都屬於直播系統的範疇。由於直播系統不僅涉及到音影片資料的編解碼,還涉及到音影片資料的實時傳輸,因此直播領域採用的網路技術標準比較高,實現起來也比一般的WEB系統複雜。

一、直播系統的概念結構

如果僅僅從使用者的角度來看,直播系統無非是直播的來源方和直播的觀看方。來源方支起三腳架,開啟補光燈,調好手機攝像頭,一頓操作之後就卿卿我我地開始直播了。觀看方開啟直播APP,蹭蹭蹭進了直播間,一會兒捏臉蛋,一會兒刷火箭,玩得不亦樂乎。對於一般開發者來說,直播的來源方和直播的觀看方之間,還要加上一層用於中轉音影片資料的雲平臺。那麼在硬體層面,就構成了直播系統的概念結構,如下圖所示。

可是這個概念結構太籠統了,因為什麼軟體都沒體現,天曉得要怎麼實施呀。對於音影片開發者來說,要提供直播系統的軟體架構圖,才算有指導意義。縱覽網路上的直播系統架構文章,很多屬於洋洋灑灑的長篇大論,給出的直播系統架構圖百轉千折,看起來足夠專業足夠高大上。然而這種直播大全的內容過於豐富,面對巍峨高山一般的直播架構,普通開發者往往望洋興嘆,不得其門而入。

也有的公司貼心提供了專門的音影片直播SDK,只需開發者在程式碼中呼叫SDK提供的API,寥寥數行即可實現直播錄製和直播觀看的功能。不過這種SDK既存在收費使用的可能性,也難以對業務需求做深入定製,畢竟不像開源軟體那般自由,當真是魚與熊掌不可兼得呀。

二、直播系統的軟體架構

有鑑於此,博主經過多年的苦心鑽研,摸索出了一套全部採用開源軟體的直播系統軟體架構,廢話不多說先看這幅直播系統的軟體架構圖。

上面這個直播系統軟體架構圖依然分成了三個層次,分別說明如下:

1、開源直播錄製軟體

開源的直播錄製軟體主要有兩種,一種是電腦端的直播錄製軟體,以OBS Studio、Streamlabs為代表;另一種是手機端的直播錄製軟體,以RTMP Streamer、SRT Streamer為代表。
OBS Studio是一個開源的直播錄製軟體,基於QT+FFmpeg編碼,它廣泛用於影片錄製、實時直播等領域。OBS不但開源,而且跨平臺,相容Windows、Mac OS、Linux等作業系統。有關OBS Studio的原始碼下載、安裝過程和使用說明詳見之前的文章《使用OBS Studio開啟RTMP直播推流》。
RTMP Streamer是一個安卓手機端的開源RTMP直播推流框架,可用於RTMP直播和RTSP直播,其升級版還支援SRT直播(騰訊影片雲就採用SRT協議)。RTMP Streamer支援的影片編碼包括H264、H265、AV1等等,支援的音訊編碼包括AAC、G711、OPUS等等。有關RTMP Streamer的原始碼下載、安裝過程和使用說明詳見之前的文章《使用RTMP Streamer開啟APP直播推流》。
SRT Streamer是一個安卓手機端的開源SRT協議直播推流框架,可用於RTMP直播和SRT直播。SRT Streamer支援的影片編碼包括H264、H265等等,支援的音訊編碼包括AAC、OPUS等等。有關SRT Streamer的原始碼下載、安裝過程和使用說明詳見之前的文章《使用SRT Streamer開啟APP直播推流》。

2、開源流媒體伺服器

開源的流媒體伺服器主要有兩種,一種是國外的開源流媒體伺服器,以MediaMTX和nginx-rtmp為代表;另一種是國產的開源流媒體伺服器,以SRS和ZLMediaKit為代表。
MediaMTX是個開源的輕量級流媒體伺服器,它的安裝過程參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“10.2.2 FFmpeg向網路推流”,使用說明詳見之前的文章《詳解MediaMTX的推拉流》。
nginx-rtmp是開源WEB伺服器Nginx可增強的第三方rtmp模組,可以提供簡單的rtmp流媒體伺服器功能。Nginx預設沒開啟rtmp模組,需要在編譯nginx時新增rtmp模組,還要修改配置檔案才能開啟rtmp,有關nginx-rtmp的原始碼下載、安裝過程和使用說明詳見之前的文章《Linux編譯nginx-rtmp實現RTMP推拉流》。
SRS是一款國產的開源實時影片伺服器,支援RTMP、WebRTC、HLS、HTTP-FLV、SRT等流媒體協議。SRS與FFmpeg、OBS、VLC、WebRTC等客戶端配合使用,提供音影片流的接收和分發的能力,還支援各種音影片協議轉換。有關SRS的原始碼下載、安裝過程和使用說明詳見之前的文章《Linux環境安裝SRS實現影片推流》。
ZLMediaKit是一款國產的開源流媒體伺服器,它基於C++11開發,支援多種流媒體協議(RTSP/RTMP/HLS/HTTP-FLV/SRT/WebRTC等),支援的音影片編碼標準包括H265、H264、AAC、G711、OPUS等。有關ZLMediaKit的原始碼下載、安裝過程和使用說明詳見之前的文章《Linux環境安裝ZLMediaKit實現影片推流》。
以上的幾種流媒體伺服器中,MediaMTX可在Windows系統部署,而nginx-rtmp、SRS、ZLMediaKit均需在Linux系統部署,部署的雲平臺廠商可選擇華為雲、阿里雲、騰訊雲等等。

3、開源音影片播放器

開源音影片播放器主要有兩種,一種是電腦端的播放軟體,以ffplay和VLC media player為代表;另一種是手機端的播放軟體,以ExoPlayer和ijkplayer為代表。
ffplay是FFmpeg自帶的播放器程式,可在命令列直接播放音影片檔案。在播放音訊時,ffplay不僅會讓揚聲器放出聲音,還會在螢幕展示該音訊的波形畫面。在播放影片時,ffplay會在螢幕展示連續的影片畫面,就像看電影看電視那樣。有關ffplay的詳細用法參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“1.4.1 可執行程式”。
VLC media player是一款跨平臺的音影片播放器,它不但開源,還相容多語言,且與FFmpeg深度融合,幾乎支援所有的音影片格式。除了常見的音影片檔案,VLC media player還能播放RTMP、RTSP等網路串流。有關VLC media player的原始碼下載、安裝過程和使用說明詳見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“3.4.1 通用音影片播放器”。
ExoPlayer是Android官方在Jetpack庫中搭載的新型播放器,它的音影片核心依賴於原生的MediaCodec介面,不但能夠播放MediaPlayer所支援的任意格式的影片,而且支援包括DASH、HLS、RTMP在內的影片直播協議。有關ExoPlayer的詳細用法參見《Android Studio開發實戰:從零基礎到App上線(第3版)》一書的“14.3.3 新型播放器ExoPlayer”。
ijkplayer是嗶哩嗶哩公司開發的基於ffplay的手機端開源播放器,它支援rtmp、rtsp、http等流媒體協議的影片直播,還具備B站特有的應用彈幕功能。ijkplayer的原始碼託管地址在https://github.com/bilibili/ijkplayer,可以在App工程中匯入它的依賴包,如下所示。

# 必要的依賴包
implementation 'tv.danmaku.ijk.media:ijkplayer-java:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-armv7a:0.8.8'
# 可選的依賴包(其他指令集)
implementation 'tv.danmaku.ijk.media:ijkplayer-armv5:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-arm64:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86:0.8.8'
implementation 'tv.danmaku.ijk.media:ijkplayer-x86_64:0.8.8'
# 可選的實驗的ExoPlayer依賴包
implementation 'tv.danmaku.ijk.media:ijkplayer-exo:0.8.8'

不過ijkplayer基於FFmpeg 3.4編寫,已經很久沒有更新了,支援的Android平臺僅限於API 9~23,支援的iOS平臺僅限於iOS 7.0~10.2.x。
綜合以上的開源直播錄製軟體、開源流媒體伺服器和開源音影片播放器,即可搭建完整的直播系統,該系統的效果圖詳見之前的文章《利用RTMP協議構建電腦與手機的直播Demo》和《利用SRT協議構建手機APP的直播Demo》。

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

相關文章