場(chǎng)景
開源流媒體服務(wù)器ZLMediaKit在Windows上運(yùn)行、配置、按需拉流拉取攝像頭rtsp視頻流)并使用http-flv網(wǎng)頁(yè)播放:
開源流媒體服務(wù)器ZLMediaKit在Windows上運(yùn)行、配置、按需拉流拉取攝像頭rtsp視頻流)并使用http-flv網(wǎng)頁(yè)播放_(tái)srs按需拉流_霸道流氓氣質(zhì)的博客-CSDN博客
上面講了ZLMediaKit的使用流程。
下面介紹另一種開源流媒體服務(wù)器。
Monibuca
Monibuca - GO語(yǔ)言開源插件式流媒體服務(wù)器開發(fā)框架 | Monibuca
Monibuca(發(fā)音:模擬不卡,m7s是其縮寫,類似k8s) 是一個(gè)開源的Go語(yǔ)言開發(fā)的流媒體服務(wù)器開發(fā)框架。
它基于go1.19+,此外并無(wú)任何其他依賴構(gòu)建,并提供了一套插件式的二次開發(fā)模型,幫助你高效地開發(fā)流媒體服務(wù)器,
你既可以直接使用官方提供的插件,也可以自己開發(fā)插件擴(kuò)展任意的功能,所以Monibuca是可以支持任意流媒體協(xié)議的框架!
注:
博客:
霸道流氓氣質(zhì)_C#,架構(gòu)之路,SpringBoot-CSDN博客
實(shí)現(xiàn)
1、Windows上安裝與配置
快速起步 | Monibuca
按照以上教程下載安裝包
選擇對(duì)應(yīng)的版本下載,這里是Windows
https://download.m7s.live/bin/m7s_windows_amd64.tar.gz
下載之后解壓,雙擊m7s.exe啟動(dòng)即可。
m7s默認(rèn)已開啟所有的插件,故已開始監(jiān)聽rtmp、rtsp、gb28181等所有協(xié)議的端口,可以直接推流到m7s。
2、推流與播放
推流:
通過(guò)OBS,推到rtmp://localhost/live/test
通過(guò)ffmpeg,ffmpeg -i [視頻源] -c:v h264 -c:a aac -f flv rtmp://localhost/live/test
通過(guò)ffmpeg,ffmpeg -i [視頻源] -c:v h264 -c:a aac -f rtsp rtsp://localhost/live/test
通過(guò)webrtc測(cè)試頁(yè)面推流,訪問(wèn)http://localhost:8080/webrtc/test/publish
通過(guò)對(duì)攝像頭配置sip服務(wù)器地址到本機(jī),指定5060端口即可將設(shè)備流送入m7s中
播放:
通過(guò)訪問(wèn)http://localhost:8080/preview/ 可以預(yù)覽所有的流(多種協(xié)議預(yù)覽頁(yè)面)
通過(guò)ffplay可以播放rtmp流,ffplay rtmp://localhost/live/test
通過(guò)ffplay可以播放rtsp流,ffplay rtsp://localhost/live/test
通過(guò)ffplay可以播放hls流,ffplay http://localhost:8080/hls/live/test.m3u8
測(cè)試:
測(cè)試使用FFmpeg推送視頻到rtmp服務(wù)器
使用如下FFmpeg指令
ffmpeg.exe -re? -stream_loop -1 -i D:\test\22.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.11935/hls/123
其中rtmp服務(wù)的默認(rèn)端口為1935
然后可以直接通過(guò)播放規(guī)則使用vlc等播放如下地址
http://127.0.0.1:18080/hdl/hls/123.flv
或可以直接訪問(wèn)其預(yù)覽的api進(jìn)行預(yù)覽和測(cè)試
http://127.0.0.1:18080/preview
點(diǎn)擊hls/123,到達(dá)預(yù)覽頁(yè)面
可點(diǎn)擊下方的播放按鈕進(jìn)行測(cè)試,這里也能看到完整的播放url。
注意這里的http接口的端口將默認(rèn)的8080修改為了18080,修改配置文件見下方。
注意事項(xiàng)
ffmpeg推流是請(qǐng)加-c:v h264 -c:a aac 否則推出的視頻格式無(wú)法使用
StreamPath 必須形如 live/test 。不能只有一級(jí),或者斜杠開頭,如/live 是錯(cuò)誤的。
m7s中的流都有一個(gè)唯一標(biāo)識(shí)就是StreamPath,StreamPath的規(guī)則是[AppName]/[StreamName],其中AppName是應(yīng)用名,StreamName是流名。
例如live/test,其中l(wèi)ive是AppName,test是StreamName。只有知道了streamPath就可以以任意一種協(xié)議來(lái)拉流播放。
h265如果通過(guò)flv、rtmp格式來(lái)播放,則必須使用定制的播放器(如jessibuca)來(lái)播放。因?yàn)閒lv和rtmp本身沒有定義h265的格式,
所以是通過(guò)擴(kuò)展的方式實(shí)現(xiàn)的。
地址拼接規(guī)則
通常,播放地址的規(guī)則是 [協(xié)議]://[Host][:Port]/[插件名]/[StreamPath]
[插件名]
其中插件名僅僅針對(duì)公用http端口的情況下需要拼接。包括websocket協(xié)議即ws-flv和ws-raw
假如host是localhost,streamPath為live/test
則HTTP-FLV協(xié)議的地址為 http://localhost:8080/hdl/live/test.flv
fmp4協(xié)議的地址為 http://localhost:8080/fmp4/live/test.mp4
hls協(xié)議的地址為 http://localhost:8080/hls/live/test.m3u8
ws-flv協(xié)議的地址為 ws://localhost:8080/jessica/live/test.flv
ws-raw協(xié)議的地址為 ws://localhost:8080/jessica/live/test
ws-raw協(xié)議
ws-raw協(xié)議 為私有協(xié)議,只能通過(guò)jessibuca播放器播放。
http端口號(hào)
http協(xié)議的默認(rèn)端口號(hào)是8080,可以通過(guò)全局配置修改,對(duì)于包含http配置的插件,可以單獨(dú)配置端口號(hào)。使用單獨(dú)的端口號(hào)則地址中不再需要拼接插件名。例如上面的例子,如果hdl插件單獨(dú)配置http端口號(hào)是8081,則地址為:http://localhost:8081/live/test.flv
rtmp播放地址則為 rtmp://localhost/live/test
rtsp播放地址則為 rtsp://localhost/live/test
默認(rèn)端口號(hào)
rtmp的默認(rèn)端口號(hào)是1935,rtsp的默認(rèn)端口號(hào)是554,不配置的情況下就是采用了默認(rèn)端口號(hào),
所以地址可以省略端口號(hào)
webrtc播放地址
webrtc其實(shí)沒有所謂的播放地址,而是通過(guò)js api來(lái)播放的。具體的api可以參考webrtc播放 如果自己播放webrtc
可以參考MDN:WebRTC API - Web APIs | MDN
首先需要完成sdp交換,然后通過(guò)建立的webrtc連接來(lái)播放。 jessibuca把上述過(guò)程簡(jiǎn)化成一個(gè)地址:
webrtc://localhost/live/test . 實(shí)際上是先和服務(wù)器建立sdp交換的連接,然后通過(guò)這個(gè)連接來(lái)建立webrtc連接。
3、如果要修改配置文件
配置 | Monibuca
v4 默認(rèn)支持零配置啟動(dòng),即無(wú)需配置文件即可運(yùn)行。如果有配置文件則配置文件中配置將會(huì)覆蓋默認(rèn)配置。
全局配置
下面是默認(rèn)配置項(xiàng),所以不需要復(fù)制到配置文件中去,只需要把需要修改的部分填寫到配置文件中即可覆蓋默認(rèn)配置。
global:
? disableall: false # 是否禁用所有插件
? loglang: zh # 日志語(yǔ)言,可選值:zh,en
? loglevel: info # 日志級(jí)別,可選值:debug,info,warn,error,panic,fatal
? http:
??? listenaddr: :8080 # 網(wǎng)關(guān)地址,用于訪問(wèn)API
??? listenaddrtls: :8443? # 用于HTTPS方式訪問(wèn)API的端口配置
??? certfile: ""
??? keyfile: ""
??? cors: true? # 是否自動(dòng)添加cors頭
??? username: ""? # 用戶名和密碼,用于API訪問(wèn)時(shí)的基本身份認(rèn)證
??? password: ""
??? readtimeout: 0 # 讀超時(shí)時(shí)間
??? writetimeout: 0 # 寫超時(shí)時(shí)間
??? idletimeout: 0 # 空閑超時(shí)時(shí)間
? publish:
????? pubaudio: true # 是否發(fā)布音頻流
????? pubvideo: true # 是否發(fā)布視頻流
????? kickexist: false # 剔出已經(jīng)存在的發(fā)布者,用于頂替原有發(fā)布者
????? insertsei: false # 是否啟用插入SEI功能
????? publishtimeout: 10s # 發(fā)布流默認(rèn)過(guò)期時(shí)間,超過(guò)該時(shí)間發(fā)布者沒有恢復(fù)流將被刪除
????? idletimeout: 0 # 發(fā)布者空閑超時(shí)時(shí)間,超過(guò)該時(shí)間發(fā)布者沒有任何操作將被刪除,0為關(guān)閉該功能
????? delayclosetimeout: 0 # 自動(dòng)關(guān)閉觸發(fā)后延遲的時(shí)間(期間內(nèi)如果有新的訂閱則取消觸發(fā)關(guān)閉),0為關(guān)閉該功能,保持連接。
????? waitclosetimeout: 0 # 發(fā)布者斷開后等待時(shí)間,超過(guò)該時(shí)間發(fā)布者沒有恢復(fù)流將被刪除,0為關(guān)閉該功能,由訂閱者決定是否刪除
????? buffertime: 0 # 緩存時(shí)間,用于時(shí)光回溯,0為關(guān)閉緩存
????? key: "" # 訂閱者鑒權(quán)秘鑰
????? secretargname: secret # 訂閱者鑒權(quán)參數(shù)名
????? expireargname: expire # 訂閱者鑒權(quán)過(guò)期時(shí)間參數(shù)名
????? speedlimit: 500ms # 限速超時(shí)時(shí)間0為不限速,對(duì)于讀取文件這類流需要限速,否則讀取過(guò)快
? subscribe:
????? subaudio: true # 是否訂閱音頻流
????? subvideo: true # 是否訂閱視頻流
????? subaudioargname: ats # 訂閱音頻軌道參數(shù)名
????? subvideoargname: vts # 訂閱視頻軌道參數(shù)名
????? subdataargname: dts # 訂閱數(shù)據(jù)軌道參數(shù)名
????? subaudiotracks: [] # 訂閱音頻軌道名稱列表
????? subvideotracks: [] # 訂閱視頻軌道名稱列表
????? submode: 0 # 訂閱模式,0為跳幀追趕模式,1為不追趕(多用于錄制),2為時(shí)光回溯模式
????? syncmode: 0 # 音視頻同步模式,0 為按照時(shí)間戳同步,1 為按照寫入時(shí)間同步
????? iframeonly: false # 只訂閱關(guān)鍵幀
????? waittimeout: 10s # 等待發(fā)布者的超時(shí)時(shí)間,用于訂閱尚未發(fā)布的流
????? writebuffersize: 0 # 訂閱者寫緩存大小,用于減少io次數(shù),但可能影響實(shí)時(shí)性
????? key: "" # 訂閱者鑒權(quán)秘鑰
????? secretargname: secret # 訂閱者鑒權(quán)參數(shù)名
????? expireargname: expire # 訂閱者鑒權(quán)過(guò)期時(shí)間參數(shù)名
????? internal: false # 是否內(nèi)部訂閱,內(nèi)部訂閱不會(huì)觸發(fā)發(fā)布者自動(dòng)斷開功能
? enableavcc : true? # 啟用AVCC格式緩存,用于rtmp協(xié)議
? enablertp : true # 啟用rtp格式緩存,用于rtsp、websocket、gb28181協(xié)議
? enableauth: true # 啟用鑒權(quán),詳細(xì)查看鑒權(quán)機(jī)制
? enablesubevent: true # 啟用訂閱事件,用于訂閱者上下線事件,關(guān)閉可以提高性能
? rtpreorderbufferlen: 50 # rtp亂序重排緩存長(zhǎng)度
? eventbussize: 10 # 事件總線緩存大小,事件較多時(shí)容易堵阻塞線程,需要增大緩存
? poolsize: 0 # 內(nèi)存池大小,高并發(fā)需要提高性能可以加大內(nèi)存池,減少 GC
? pulseinterval: 5s # 心跳事件間隔時(shí)間
? console:
??? server : console.monibuca.com:44944 # 連接遠(yuǎn)程控制臺(tái)的地址
??? secret: "" # 遠(yuǎn)程控制臺(tái)的秘鑰
??? publicaddr: "" # 實(shí)例公網(wǎng)地址,提供遠(yuǎn)程控制臺(tái)訪問(wèn)的地址,不配置的話使用自動(dòng)識(shí)別的地址
??? publicaddrtls: "" # 實(shí)例公網(wǎng)地址,提供遠(yuǎn)程控制臺(tái)訪問(wèn)的地址,不配置的話使用自動(dòng)識(shí)別的地址(https)
比如這里要修改http的端口為18080
找到config.yaml,修改對(duì)應(yīng)位置即可。
插件配置
插件配置由插件定義
每個(gè)插件的具體配置信息請(qǐng)查看插件文檔
比如要修改rtsp的配置,對(duì)照插件配置說(shuō)明修改conf下rtsp.yaml即可
4、拉流并轉(zhuǎn)換flv實(shí)現(xiàn)
這里以從遠(yuǎn)程拉取rtsp流為例
參考插件文檔
rtsp/api/pull?target=[RTSP地址]&streamPath=[流標(biāo)識(shí)]&save=[0|1|2]#
從遠(yuǎn)程拉取rtsp到m7s中
save含義:0、不保存;1、保存到pullonstart;2、保存到pullonsub
RTSP地址需要進(jìn)行urlencode 防止其中的特殊字符影響解析
首先需要模擬一個(gè)rtsp流
Windows上使用FFmpeg實(shí)現(xiàn)本地視頻推送模擬??祬f(xié)議rtsp視頻流:
Windows上使用FFmpeg實(shí)現(xiàn)本地視頻推送模擬??祬f(xié)議rtsp視頻流_ffmpeg windows 推流_霸道流氓氣質(zhì)的博客-CSDN博客
然后調(diào)用其拉流api
比如這里模擬的rtsp流為
rtsp://username:password@127.0.0.1:554/h264/ch01/main/av_stream
則調(diào)用api的完整url為
http://127.0.0.1:18080/rtsp/api/pull?target=rtsp://username:password@127.0.0.1:554/h264/ch01/main/av_stream&streamPath=live/badao&save=0
然后對(duì)應(yīng)的http-flv的播放地址為
http://127.0.0.1:18080/hdl/live/badao.flv
更多api使用可訪問(wèn)
http://127.0.0.1:18080/
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-678821.html
或者官方插件文檔說(shuō)明文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-678821.html
到了這里,關(guān)于Monibucav4(開源流媒體服務(wù)器)在Windows上搭建rtmp服務(wù)器并實(shí)現(xiàn)拉取rtsp視頻流以及轉(zhuǎn)換flv播放的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!