FFmpeg開發筆記(十五)詳解MediaMTX的推拉流

aqi00發表於2024-04-20
MediaMTX是個開源的輕量級流媒體伺服器,它的安裝過程參見《FFmpeg開發實戰:從零基礎到短影片上線》一書的“10.2.2 FFmpeg向網路推流”。MediaMTX下載後的壓縮包包括可執行程式mediamtx.exe和配置檔案mediamtx.yml,看起來非常簡約,但它提供的流媒體服務一點也沒縮水。雙擊mediamtx.exe,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開啟了下列五項流媒體服務:
1、偵聽8554埠的RTSP服務,對應的流媒體播放地址是rtsp://127.0.0.1:8554/stream;
2、偵聽1935埠的RTMP服務,對應的流媒體播放地址是rtmp://127.0.0.1:1935/stream;
3、偵聽8888埠的HLS服務,對應的流媒體播放地址有兩個,其中http://127.0.0.1:8888/stream可以直接透過瀏覽器播放(比如Chrome),另一個http://127.0.0.1:8888/stream/index.m3u8需要用播放器開啟。
4、偵聽8889埠的WebRTC服務;
5、偵聽8890埠的SRT服務;
接下來驗證MediaMTX的實際推拉流情況。開啟MSYS視窗,進入《FFmpeg開發實戰:從零基礎到短影片上線》一書第十章的原始碼目錄,執行下面的編譯命令。

gcc pushvideo.c -o pushvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm

編譯完成後執行以下命令啟動測試程式,期望把2018.mp4推給預設的推流地址rtsp://127.0.0.1:8554/stream。

./pushvideo ../2018.mp4

開啟另一個MSYS視窗,同樣進入《FFmpeg開發實戰:從零基礎到短影片上線》一書第十章的原始碼目錄,執行下面的編譯命令。

gcc pullvideo.c -o pullvideo -I/usr/local/ffmpeg/include -L/usr/local/ffmpeg/lib -I/usr/local/sdl2/include -L/usr/local/sdl2/lib -lsdl2 -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lpostproc -lm

編譯完成後執行以下命令啟動測試程式,期望從http://127.0.0.1:8888/stream/index.m3u8拉取影片流並彈窗播放。

./pullvideo http://127.0.0.1:8888/stream/index.m3u8

然後果真彈出一個SDL視窗,正在播放從HLS服務拉取的影片畫面,說明MediaMTX正確實現了HLS協議的流媒體轉發功能。
不過對於上面的HLS協議,具體的播放情況比較複雜,比如http://127.0.0.1:8888/stream只能透過Chrome播放,不能透過FireFox或者Edge播放。而http://127.0.0.1:8888/stream/index.m3u8這個地址無法使用Windows Media Player開啟,即使透過VLC播放也不顯示畫面。推測是因為pushvideo只推送影片流不推送音訊流,而VLC的音影片同步機制採用音訊基準,由於缺失音訊流使得影片流無處校準導致不能正常顯示畫面。

相關文章