web flash rtmp_基于RTMP和WebRTC开发大规模低延迟(1000毫秒内)直播系统
問(wèn)題
隨著移動(dòng)設(shè)備大規(guī)模的普及以及流量的資費(fèi)越來(lái)越便宜, 超低延遲的場(chǎng)景越來(lái)越多. 從去年到今年火過(guò)的場(chǎng)景就有在線娃娃機(jī), 直播答題, 在線K歌等. 但要做到音視頻的超低延遲確是很不容易, 編碼延遲, 網(wǎng)絡(luò)丟包, 網(wǎng)絡(luò)抖動(dòng), 多節(jié)點(diǎn)relay,視頻分段傳輸,播放端緩存等等都會(huì)帶來(lái)延遲.
WebRTC興起提供的方案以及遇到的問(wèn)題
WebRTC技術(shù)的興起為低延遲音視頻傳輸帶來(lái)了解決方案, 但WebRTC是為端到端設(shè)計(jì)的, 適合的場(chǎng)景是小規(guī)模內(nèi)的實(shí)時(shí)互動(dòng), 例如視頻會(huì)議, 連麥場(chǎng)景. 即使加入了SFU Media server作為轉(zhuǎn)發(fā)服務(wù)器, 也很難做到大規(guī)模的分發(fā). 另外一個(gè)需要考量的是流量成本, WebRTC的實(shí)時(shí)流量是通過(guò)UDP傳輸?shù)?某些情況下可以用TCP), 無(wú)法復(fù)用在傳統(tǒng)CDN的架構(gòu)之上, 實(shí)時(shí)的流量?jī)r(jià)格更是CDN流量的3倍以上, 部署一個(gè)超低延遲的直播網(wǎng)絡(luò)成本非常高.
RTMP系統(tǒng)推流播放延遲分析
一個(gè)經(jīng)過(guò)優(yōu)化的RTMP-CDN網(wǎng)絡(luò)端到端的延遲大概在2-3秒, 延遲大一些要在5秒甚至10秒以上. 從推流到播放, 會(huì)引入延遲的環(huán)節(jié)有編碼延遲, 網(wǎng)絡(luò)丟包和網(wǎng)絡(luò)抖動(dòng), 視頻的分段傳輸, 多媒體節(jié)點(diǎn)的relay, 播放器的緩存等等. 實(shí)際上除了網(wǎng)絡(luò)丟包和網(wǎng)絡(luò)抖動(dòng)不太可控之外, 其他的各各環(huán)節(jié)都有一定的優(yōu)化方案, 比如使用x264的-preset ultrafast和zerolatency, 可以降低編碼的延遲,
分段傳輸部分可以把GOP減少到1秒之內(nèi), 在播放器端可以適當(dāng)減小buffer, 并設(shè)置一定的追幀策略, 防止過(guò)大的buffer引起的時(shí)延.
低成本的低延遲的實(shí)現(xiàn)
在RTMP直播系統(tǒng)中從推流端到網(wǎng)絡(luò)傳輸?shù)讲シ牌鞫甲錾疃榷ㄖ拼_實(shí)可以做到比較低的延遲, 但成本也是比較高的, 需要完備的高水平的團(tuán)隊(duì)(服務(wù)端和客戶(hù)端), 以及大量的帶寬服務(wù)器資源. 如果想做到超低延遲(1000毫秒以?xún)?nèi))更是難上加難, 而且這么低的延遲也會(huì)帶來(lái)一些負(fù)面的效果, 網(wǎng)絡(luò)出現(xiàn)少許抖動(dòng)的時(shí)候就會(huì)出現(xiàn)卡頓等等. 有沒(méi)有更低成本的實(shí)現(xiàn)方案呢? 以及如何復(fù)用現(xiàn)有的CDN的基礎(chǔ)設(shè)施來(lái)做到低延遲? 其實(shí)我們可以在現(xiàn)有的RTMP-CDN系統(tǒng)上做一些優(yōu)化調(diào)整, 在邊緣節(jié)點(diǎn)把RTMP流轉(zhuǎn)化為WebRTC可以播放的流來(lái)達(dá)到低延遲和CDN系統(tǒng)的復(fù)用, 同時(shí)還可以利用WebRTC抗丟包來(lái)優(yōu)化最后一公里的觀看體驗(yàn). WebRTC在各個(gè)平臺(tái)上都有相應(yīng)的SDK, 尤其是在瀏覽器內(nèi)嵌, 可以極大的減少整個(gè)系統(tǒng)的開(kāi)發(fā), 升級(jí), 維護(hù)成本, 達(dá)到打開(kāi)瀏覽器就可以觀看的效果.
需要注意的問(wèn)題
當(dāng)然事情不可能那么完美, 讓RTMP和WebRTC可以很好的互通也需要做一些額外的工作:
1, RTMP推流端低延遲以及GOP大小
如果想做到低延遲, 我們需要在推流端盡可能的快, 同時(shí)RTMP-CDN一般都會(huì)有GOP cache, 會(huì)緩存最近的一個(gè)GOP, GOP太大是沒(méi)法做到低延遲的, 可以考慮把GOP設(shè)置在1秒. 這樣的好處還有一個(gè)就是在WebRTC播放端, 如果出現(xiàn)丟關(guān)鍵幀的情況可以快速回復(fù). 在我們這個(gè)場(chǎng)景下WebRTC服務(wù)端會(huì)拒絕WebRTR的FIR信息, 通過(guò)下一個(gè)關(guān)鍵幀來(lái)解決關(guān)鍵幀丟失的問(wèn)題.
2, RTMP源站以及邊緣站盡可能的不做任何緩存
在一個(gè)幀率為25FPS的直播流中, 緩存一幀就會(huì)增加40ms的延遲. 在我們這個(gè)場(chǎng)景下RTMP的源站和邊緣站除了做一些GOP cache外, 其他緩存要盡可能的小.3, 編碼器參數(shù)設(shè)置
WebRTC對(duì)H264的支持還沒(méi)有那么完美, 比如在chrome支持H264的baseline, main profile 以及high profile, firefox和safari目前支持baseline.
B幀的存在雖然可以降低一些帶寬占用確會(huì)引入更多的延遲, 不推薦使用. 經(jīng)過(guò)測(cè)試H264的編碼參數(shù)選擇可以選擇為baseline level3.
4, PPS和SPS
在RTMP場(chǎng)景中通常我們只會(huì)在推流開(kāi)始的時(shí)候加入PPS和SPS, 但WebRTC要求在每個(gè)關(guān)鍵幀前面都有PPS和SPS, 這個(gè)問(wèn)題我們可以在推流的時(shí)候解決, 也可以在把RTMP轉(zhuǎn)成RTP的時(shí)候加入. 萬(wàn)能的ffmpeg已經(jīng)支持這個(gè)bitstream filter -- dump_extra, 謝謝ffmpeg讓音視頻開(kāi)發(fā)者節(jié)省了那么多的時(shí)間.
5, 音頻轉(zhuǎn)碼
RTMP的協(xié)議規(guī)范中音頻支持pcma和pcmu, WebRTC也支持pcma和pcmu, 如果RTMP推流端推送的音視是pcma或者pcmu格式, 我們就不用轉(zhuǎn)碼了. 當(dāng)然現(xiàn)實(shí)比較殘酷, 在RTMP體系中大多數(shù)廠商和開(kāi)源項(xiàng)目只支持AAC, 這個(gè)時(shí)候我們需要對(duì)音頻做轉(zhuǎn)碼. 這樣的工作對(duì)于萬(wàn)能的ffmpeg來(lái)說(shuō)也只有一二十行代碼的事情, 再一次謝謝ffmpeg讓音視頻開(kāi)發(fā)者節(jié)省了那么多的時(shí)間.(如果想學(xué)ffmpeg 可以購(gòu)買(mǎi)大師兄的書(shū)<<FFmpeg從入門(mén)到精通>>)
6, 視頻轉(zhuǎn)封裝
視頻部分我們上邊提到盡可能的用H264 baseline, 這樣的話WebRTC支持也會(huì)比較好. 我們只需要把RTMP流轉(zhuǎn)封裝為RTP的流, 喂給相應(yīng)的WebRTC mediaserver.
這部分可以借助FFmpeg或者gstreamer來(lái)完成.
如何落地
目前身邊完全沒(méi)有完全匹配的需求, 這個(gè)方案目前并沒(méi)有落地, 設(shè)想中的落地方式是, RTMP部分還是用現(xiàn)有的CDN, 自己部署WebRTC的邊緣節(jié)點(diǎn), 根據(jù)訪問(wèn)請(qǐng)求向CDN拉流.
需要開(kāi)發(fā)的地方只有邊緣節(jié)點(diǎn)WebRTC media server部分, 這部分我們可以借助一些開(kāi)源的media server然后再做一些業(yè)務(wù)上的開(kāi)發(fā). 支持rtp輸入的開(kāi)源WebRTC mediaserver 有janus-gateway, medooze mediaserver.
Talk is cheap, show me the code. 我實(shí)現(xiàn)了一個(gè)RTMP推流WebRTC播放的原型實(shí)現(xiàn), 在阿里云上測(cè)試延遲在1000ms以?xún)?nèi), 經(jīng)過(guò)一些優(yōu)化可以把延遲降低到500ms以?xún)?nèi).
完整的代碼在這里
我部署了一個(gè)測(cè)試版本網(wǎng)址在這里:https://rtmp-to-webrtc.dot.cc
總結(jié)
以上是生活随笔為你收集整理的web flash rtmp_基于RTMP和WebRTC开发大规模低延迟(1000毫秒内)直播系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 佛教术语:苦空无常无我
- 下一篇: 传音 TECNO 首款折叠屏手机 PHA