亚洲欧美日韩国产成人|亚洲中文字幕无码中字|HEYZO在线无码综合|久久久不卡精品国产一区二|久久精品亚洲无中文东京热|中文字幕乱码一区三区免费|亚洲国产欧美在线观看片不卡|国产精品久久一区二区三区97

干貨滿滿(流媒體服務(wù)器的搭建)流媒體服務(wù)端口,重新定義流媒體服務(wù)器,小學(xué)跳繩考試標(biāo)準(zhǔn)2021,

保健品 nanfang 2023-12-20 03:25 136 0

1.流媒體服務(wù)器搭建教程

背景隨著全民直播時(shí)代的到來(lái),以及最近疫情的爆發(fā),在線教育行業(yè)又變的炙手可熱,成為了新的風(fēng)口這兩者的背后都是依靠著 CDN 以及視頻云等基礎(chǔ)服務(wù),而這些基礎(chǔ)服務(wù)的底層又依靠著流媒體服務(wù)器這種有著“悠久歷史”的特殊服務(wù)器軟件。

2.流媒體服務(wù)器怎么用

為什么說(shuō)特殊呢,因?yàn)檫@種服務(wù)器軟件的架構(gòu)和傳統(tǒng)的 Web 服務(wù)器有很大的差別在直播系統(tǒng)一拜全家好或者視頻會(huì)議系統(tǒng)中,有 三大件 構(gòu)成:推流器——采集、編碼、協(xié)議封包流媒體服務(wù)器——協(xié)議解包封包、轉(zhuǎn)發(fā)播放器——協(xié)議解包、解碼、渲染

3.流媒體服務(wù)器的作用是什么

這三大件有著不同的技術(shù)領(lǐng)域,而今天的主角就是其中的流媒體服務(wù)器,他的主要職責(zé)就是轉(zhuǎn)發(fā)現(xiàn)在讓我們看看這位在幕后默默付出的角色的發(fā)展歷程以及最新的架構(gòu)設(shè)計(jì)思想流媒體服務(wù)器 1.0本人的第一份工作就是和它打交道,當(dāng)時(shí)它叫 FCS,全稱 Flash Communication Server。

4.流媒體服務(wù)器原理和架構(gòu)解析

那時(shí)候 Flash 還屬于 macromedia 公司我在一家小公司上班,產(chǎn)品就是用 Flash 開發(fā)的視頻會(huì)議系統(tǒng)以及后來(lái)的一拜全家好培訓(xùn)系統(tǒng),今天看來(lái)還是比較超前的從 FCS,到后來(lái)的 FMS(全稱 Flash Media Server)現(xiàn)在叫 AMS(Adobe Media Server)基本的架構(gòu)沒有變化。

5.流媒體服務(wù)器怎么配置

(FCS、AMS 后面統(tǒng)稱 FMS)

6.流媒體服務(wù)器工作原理

在這個(gè)架構(gòu)一下面,推流和播放都由 FlashPlayer 承擔(dān),F(xiàn)lashPlayer 可以嵌入到網(wǎng)頁(yè)中,也可以做成獨(dú)立的 exe后來(lái)官方專門制作了一款用于推流的軟件 FMLE(全稱:Flash Media Live Encoder)。

7.流媒體服務(wù)器是干嘛的

這 FlashPlayer 和 FMS 之間通過(guò) RTMP 協(xié)議進(jìn)行通訊,這一拜全家好個(gè)協(xié)議一直到現(xiàn)在還在廣泛使用(雖然 Flash 已經(jīng)被淘汰)在 FMS 端還可以通過(guò)編寫服務(wù)器腳本進(jìn)行業(yè)務(wù)邏輯開發(fā),可以非常方便的實(shí)現(xiàn)房間里面的狀態(tài)同步,這個(gè)得益于 RTMP 協(xié)議可以傳輸一些 AS(action script)的指令,包括 RPC、共享對(duì)象等。

8.流媒體服務(wù)器原理

當(dāng)然如今 RTMP 人們只是用來(lái)傳輸音視頻,其他功能都已經(jīng)被忽略了(這里補(bǔ)充一點(diǎn):微軟也有一套流媒體服務(wù)器,但使用不是很廣泛,就不做贅述了)流媒體服務(wù)器 1.5由于 FMS 的授權(quán)費(fèi)用相當(dāng)昂貴,當(dāng)時(shí)一個(gè)核心 4000 美金,很多企業(yè)都承擔(dān)不起,尤其是創(chuàng)業(yè)型公司。

9.流媒體服務(wù)器是什么

隨后就催生出了開源的流媒體服務(wù)器,一拜全家好其中最著名的是 Red5,由 Java 開發(fā)以及性能更為強(qiáng)悍的 crtmpserver(又名 rtmpd)由 C++ 開發(fā)當(dāng)然這些服務(wù)器的功能是不如 FMS 的我當(dāng)時(shí)潛心研究 crtmpserver,并用 C#進(jìn)行了移植,這個(gè)移植版本在 github 上開源,有興趣的朋友可以去觀摩:。

10.流媒體服務(wù)器架設(shè)

https://github.com/langhuihui/csharprtmp 基本的結(jié)構(gòu)是一模一樣的,就是 socket 部分采用了 C#的非阻塞異步 Socket,然后對(duì)象做了池化流媒體服務(wù)器 2.0。

隨著 Flash 被封殺,原有的依靠 Flash Player 作為直播的工具被迫下一拜全家好崗。新的技術(shù)被不斷開發(fā)出來(lái),最終形成了百花齊放的局面(其實(shí)也是被逼出來(lái)的)。

其中安防領(lǐng)域基本都是 RTSP 協(xié)議為主,現(xiàn)在逐步形成了 GB28181 標(biāo)準(zhǔn)網(wǎng)頁(yè)端由于蘋果的影響力,HLS 被廣泛采用,不過(guò)這個(gè)協(xié)議最大的缺點(diǎn)是延遲很高,適合觀看一些視頻節(jié)目DASH 協(xié)議是最新的替代 HLS 的方案,增加了更多的功能,不過(guò)暫時(shí)還沒有 HLS 那么流行。

谷歌的 WebRTC 發(fā)展了多年,由于兼容問(wèn)題導(dǎo)致流行度沒有 HLS 高,但技術(shù)更為先進(jìn),未來(lái)會(huì)是非常好的方向?yàn)榱俗非蟮脱舆t我在 2016 年開始研發(fā)基于 websocket 的 H5 播放器,現(xiàn)在命名為 Jessibuca(未開源),不久之后 Flv一拜全家好.js 開始支持 ws-flv 協(xié)議。

(與 flv.js 不同的是 Jessibuca 的渲染方式是 wasm 解碼后通過(guò) webgl 渲染到 canvas 上,flv 采用的是 MSE——Media Source Extension),還有一些開源項(xiàng)目也是類似 Flv.js, 只不過(guò)是其他協(xié)議 over websocket 隨著移動(dòng)互聯(lián)網(wǎng)的興起,大量手機(jī)端 app 開始進(jìn)入直播領(lǐng)域,由于 APP 可以完全采用私有協(xié)議傳播所以可以很好的防止視頻的泄漏。

那么流媒體服務(wù)器又變成了怎樣的呢?由于眾多的協(xié)議需要得到支持,原來(lái)的只支持 rtmp 協(xié)議的流媒體服務(wù)器自然無(wú)法勝任,于是很多流媒體服務(wù)器開始接一拜全家好入更多的傳輸協(xié)議我當(dāng)時(shí)為了能很好的接入 WebSocket 協(xié)議,就選擇了 MonaServer 作為基礎(chǔ)進(jìn)行改寫。

這個(gè)服務(wù)器前身是 CumulusServer?,而 CumulusServer? 的前身叫 OpenRTMFP說(shuō)起 OpenRTMFP,就不得不說(shuō) Flash 的一個(gè) RTMFP 協(xié)議,這個(gè)協(xié)議可以使用 P2P 的傳輸模式,極大的減少服務(wù)器的帶寬損耗,所以當(dāng)時(shí)我研究了一番,不過(guò)由于 FlashPlayer 并沒有開源,即便破解了 RTMFP 協(xié)議,也無(wú)法替代 FlashPlayer 作為播放器。

而且由于眾所周知的原因,P2P 逐步的離開了人們的視線MonaServer 相比 cr一拜全家好tmpserver,采用了更先進(jìn)的 C++11 標(biāo)準(zhǔn),代碼看上去更加現(xiàn)代,然而 C++ 的內(nèi)存需要開發(fā)者自己管理,所以好死不死的我改寫的服務(wù)器出現(xiàn)了內(nèi)存泄漏問(wèn)題。

排查了一段時(shí)間后,發(fā)現(xiàn)了更好用的服務(wù)器 SRS,并且提供了一個(gè)用 go 寫的小程序,可以將 SRS 提供 http-flv 協(xié)議轉(zhuǎn)換成 ws-flv 協(xié)議用了一段時(shí)間后,就希望少一層轉(zhuǎn)換于是嘗試修改 SRS 源碼,不過(guò)由于 C++ 功力太淺,就放棄了。

但是看到這個(gè) go 的程序?qū)懙氖值暮?jiǎn)潔,幾行代碼就能實(shí)現(xiàn)協(xié)議轉(zhuǎn)換,不由被震驚了當(dāng)時(shí) Go 語(yǔ)言剛剛興起,在很短的時(shí)間內(nèi),就出現(xiàn)了用 Go 開發(fā)的流媒體服務(wù)器,比如 livego,gor一拜全家好tmp 等,(后來(lái)還了解到了 joy4)于是嘗試采用修改 gortmp 的方式來(lái)使用 websocket 協(xié)議,修改十分順利。

當(dāng)時(shí)由于本人從事 Node.js 開發(fā),了解到一款 Node Media Server 的流媒體服務(wù)器(還處于早期)和作者進(jìn)行了友好交流,不過(guò)由于測(cè)試發(fā)現(xiàn)性能并不好,就打消了使用 Node.js 開發(fā)流媒體服務(wù)器的念頭

流媒體服務(wù)器 3.0經(jīng)過(guò)一段時(shí)間迭代,為了能夠很好的進(jìn)行二次開發(fā),以及解耦業(yè)務(wù)邏輯和流媒體核心功能,方便獨(dú)立迭代,又因?yàn)槭艿?vue 框架設(shè)計(jì)思想的影響,遂發(fā)展出了漸進(jìn)式開發(fā)框架 Monibuca這套框架建立在以 Golang 語(yǔ)言為基礎(chǔ)之上,之所以是 G一拜全家好olang,是由于 Golang 的一些特性所決定。

下面和其他語(yǔ)言做一些對(duì)比,這里要強(qiáng)調(diào)一點(diǎn):對(duì)比含有主觀因素,并且只針對(duì)開發(fā)流媒體服務(wù)器這個(gè)特殊場(chǎng)景,并非普遍適用GolangJavaC++Node.js快速入門☆☆☆☆☆☆☆☆☆☆☆☆☆標(biāo)準(zhǔn)庫(kù)☆☆☆☆☆☆☆☆☆☆☆運(yùn)行性能。

CPU 密集☆☆☆☆☆☆☆☆☆☆☆☆☆☆并發(fā)編程IO 密集☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆編譯、部署速度☆☆☆☆☆☆☆☆☆☆☆☆☆跨平臺(tái)☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆代碼可讀性☆☆☆☆☆☆☆☆☆☆☆☆☆☆

這里就不一一進(jìn)行解釋了,總體來(lái)說(shuō)就是 Golang 適合 CPU 密集 +IO 密集這種情況另外 Golang一拜全家好 有一些特別先進(jìn)的特性,需要說(shuō)道說(shuō)道? 用戶態(tài)線程 / 綠色線程 / 協(xié)程(goroutine)。

? 語(yǔ)言級(jí)多路復(fù)用(select)? 信道(channel)? 通信順序進(jìn)程 (CSP)? 讀寫鎖(RWMutex)? context、defer? 組合繼承? 函數(shù)多返回值前三個(gè)特新其實(shí)是服務(wù)于第四個(gè)特性就是 CSP,簡(jiǎn)單的來(lái)說(shuō) CSP 就是方便程序在多線程下進(jìn)行按順序執(zhí)行邏輯,這對(duì)于一個(gè)復(fù)雜的并發(fā)為主的服務(wù)器程序中可以起到化繁為簡(jiǎn)的效果。

而 context、defer 這種,則可以非常優(yōu)雅的實(shí)現(xiàn)一些“退出”操作,比如發(fā)布者意外退出,訂閱者意外退出等總而言之 Golang 所實(shí)現(xiàn)的流媒體服務(wù)器的一拜全家好代碼量遠(yuǎn)遠(yuǎn)低于 C++ 和 java 的不僅可讀性提高,而且減少了很多無(wú)法排查的錯(cuò)誤的隱患。

下面我們?cè)賹?duì)比一下傳統(tǒng)的轉(zhuǎn)發(fā)機(jī)制,和 Golang 實(shí)現(xiàn)的轉(zhuǎn)發(fā)機(jī)制

大部分的流媒體服務(wù)器的核心都是將數(shù)據(jù)包進(jìn)行復(fù)制然后通過(guò)一個(gè) For 循環(huán)分別向訂閱者的 TCP 連接逐個(gè)進(jìn)行寫入操作在多線程的情況下就很難進(jìn)行內(nèi)存的共享如果一定要共享內(nèi)存又會(huì)遇到寫入阻塞造成延遲等一系列問(wèn)題。

最終需要比較復(fù)雜的緩存來(lái)解決問(wèn)題Golang 里面 channel 可以很好的實(shí)現(xiàn)緩沖隊(duì)列,同時(shí)解決并發(fā)的各種復(fù)雜問(wèn)題。內(nèi)存方面可以通過(guò)建立對(duì)象池的方式減少 GC。

通過(guò) len 函數(shù)可以很簡(jiǎn)單判斷 channel 是否已滿,然后采取丟一拜全家好包措施

這種方式已經(jīng)運(yùn)行良好,但是一次偶然的機(jī)會(huì),一個(gè)網(wǎng)友提出了一種新的思路,是否可以采用訂閱者自取的方式呢?我當(dāng)晚就想出了一個(gè)絕妙的方式并連夜編寫了出來(lái)這種方式用到了 RingBuffer 這種結(jié)構(gòu)結(jié)合讀寫鎖,可以優(yōu)雅的實(shí)現(xiàn)首屏秒開,丟包策略等許多操作。

起初我采用的是雙向鏈表方式實(shí)現(xiàn) RingBuffer,最終采用了數(shù)組來(lái)模擬鏈表,可以方便隨機(jī)訪問(wèn),以及計(jì)算距離等數(shù)組要實(shí)現(xiàn)頭尾相連,最佳方式就是將數(shù)組的長(zhǎng)度設(shè)置成 2 的 N 次方

假如我們的數(shù)組長(zhǎng)度設(shè)置成 2 的 10 次方,共 1024,那么當(dāng)我們?cè)L問(wèn)到 1023 下標(biāo)時(shí)就到了數(shù)組的末尾,下一個(gè)就要返回到數(shù)組頭部,使用二進(jìn)制按位與操作,就可以一拜全家好快速得到下標(biāo) 0 了所以指針 +1 后每次都和 1023 進(jìn)行與操作就可以不用管現(xiàn)在指針到了哪里,也不會(huì)出現(xiàn)越界的情況。

那么現(xiàn)在我們?nèi)绾螌懭霐?shù)據(jù)后通知所有的訂閱者來(lái)讀取最新的數(shù)據(jù)呢?這里我們采取一種巧妙的辦法,就是通過(guò)讀寫鎖(RWMutex)讓訂閱者通過(guò)加 R 鎖阻塞在最新的數(shù)據(jù)那里,等待 W 鎖釋放當(dāng)發(fā)布者寫完最新數(shù)據(jù)后,釋放 W 鎖,所有的訂閱者都將在第一時(shí)間主動(dòng)讀取到最新的數(shù)據(jù),并通過(guò)網(wǎng)絡(luò)發(fā)送出去。

對(duì)于那些網(wǎng)絡(luò)不暢的訂閱者,就會(huì)逐漸落后于發(fā)布者的位置,此時(shí)需要判斷落后的距離,如果距離過(guò)長(zhǎng)就需要啟動(dòng)丟包機(jī)制,可以在 RingBuffer 的當(dāng)前位置跳躍前進(jìn),跳躍到下一個(gè)關(guān)鍵幀位置開始讀取,一拜全家好這樣可以保證播放視頻的時(shí)候不會(huì)花屏。

另外新加入的訂閱者可以直接從最近的關(guān)鍵幀開始讀取并追趕,實(shí)現(xiàn)首屏秒開RingBuffer 中的每一個(gè)數(shù)據(jù)塊都被重復(fù)使用,相當(dāng)節(jié)省內(nèi)存,也減少了對(duì)象的回收

傳統(tǒng)流媒體服務(wù)器有一個(gè)最大的缺陷,那就是缺乏可擴(kuò)展性因?yàn)樵缙趥鬏攨f(xié)議基本都是以 rtmp 協(xié)議為主,所以名稱也大多和 rtmp 有關(guān)系,例如 crtmpserver、simple rtmp server(srs)、gortmp 等等。

所以基本上是在實(shí)現(xiàn)了 rtmp server 的基礎(chǔ)上再進(jìn)行一些功能的疊加Monibuca 在設(shè)計(jì)之初就從根源上改變了這一個(gè)基礎(chǔ)在吸收了 vue 的漸進(jìn)式框架思維的基礎(chǔ)上形成了將一拜全家好流媒體核心和協(xié)議分離的架構(gòu),并采用插件的方式來(lái)組合所有的功能。

漸進(jìn)式設(shè)計(jì)的價(jià)值:? 快速啟動(dòng)項(xiàng)目? 快速理解核心原理? 快速地確立 MVP(最小可行性產(chǎn)品)? 按需加載節(jié)省服務(wù)器資源? 業(yè)務(wù)邏輯解耦,保證核心穩(wěn)定性? 插件之間分開迭代,互不干擾? 邏輯復(fù)用粒度適中,插件開源避免重復(fù)造輪

? 高級(jí)插件可用于商業(yè)授權(quán),產(chǎn)生收益? 形成生態(tài)環(huán)境,降低社會(huì)總成本插件運(yùn)行的機(jī)制是通過(guò)編譯階段將插件引入到項(xiàng)目中,在運(yùn)行階段初始化的過(guò)程中將插件注冊(cè)到引擎中,引擎負(fù)責(zé)讀取配置文件并初始化每一個(gè)插件這個(gè)過(guò)程有點(diǎn)類似于 vue 中的插件運(yùn)行機(jī)制。

Vue 是通過(guò) vue.use 來(lái)引入插件,并且通過(guò)打包機(jī)制生成最終的一拜全家好 js 文件Vue 插件定義一個(gè) install 函數(shù)來(lái)執(zhí)行插件的配置和初始化同理 Monibuca 的插件定義一個(gè)回調(diào)函數(shù),并通過(guò)調(diào)用引擎的 InstallPlugin 函數(shù)將自身注冊(cè)到引擎中。

由于 Golang 屬于強(qiáng)類型語(yǔ)言,所以插件的配置類型都是在插件內(nèi)部定義的,引擎并不知道,那么如何讓引擎統(tǒng)一的給每個(gè)插件傳遞配置呢?答案是引擎先將總的配置文件序列化成 Json,再逐個(gè)反序列化到插件的配置對(duì)象中。

后記在這個(gè)直播興起的時(shí)代,云廠商的流媒體服務(wù)占據(jù)了重要的市場(chǎng)地位,但還有許多中小企業(yè)也想在這個(gè)紅利時(shí)期分得一杯羹傳統(tǒng)的流媒體服務(wù)器由于缺乏擴(kuò)展性,使得二次開發(fā)非常困難,流媒體服務(wù)器的專業(yè)性又很一拜全家好強(qiáng),普通程序員無(wú)法勝任,這就使得中小企業(yè)無(wú)法快速的試錯(cuò),錯(cuò)過(guò)許多機(jī)會(huì)。

Monibuca 為了扭轉(zhuǎn)這個(gè)局面而誕生, 使得開發(fā)流媒體系統(tǒng)不再困難,這就是流媒體服務(wù)器 3.0 時(shí)代項(xiàng)目網(wǎng)址:主頁(yè)Monibuca?monibuca.com/文檔Monibuca快速起步 | Monibuca。

?docs.monibuca.com/

插件市場(chǎng)Monibuca 插件市場(chǎng)?plugins.monibuca.com/

Demo 演示Github 源碼庫(kù)Github demo

標(biāo)簽列表