現在GB28181的平台很多,但是能夠實作GB28181接入裝置的web無插件超低延時的直播确實不多,或者叫沒有。有的小公司甚至直接使用開源的工具去實作GB28181轉webrtc的直播,前期技術調研時大部分開源代碼都看了,除了小部分封包代碼值得借鑒,其他發現性能和架構是不具備商用實施基礎的。
最終筆者決定采用多線程+協程的方式,對realgbs平台實作了更新,添加了對接入的GB28181裝置進行webrtc直播,因為參考開源webrtc規範源碼後,全程自主研發。将一些多并發不耗時的碎片化處理過程設計到協程裡,減少系統個核心資源切換的開銷。同時結合平台直播和作業系統的實際情況,将長期持續高效占用的過程放進了一個獨立的線程。這樣大大提高了平台的性能。
因為全部自主研發,延時,緩存全部可控,我們最終經過測試實作了正常網絡下端到端延時200ms。這樣保證在帶寬充足的條件下,普通筆記本的cpu和4G的記憶體可以并發1000路裝置實時音視訊的轉發。如下圖:

如上圖,采用多線程+協程處理的webrtc直播後,接入GB28181裝置後,其端到端的延時僅有435 - 231 = 204ms,整個平台記憶體占用10M。這在全國同類産品應該是具有很大的優勢了。
webrtc是html5的标準,前端js代碼其實也很簡單,但是內建到vue裡,很多部落格都沒講清楚,步驟如下:
1.建立peerconnect,将流對象綁定video元素
this.peerconn = new RTCPeerConnection(null)
this.peerconn.onaddstream = function (event) {
var videoElement = document.getElementById('rtc-player')
videoElement.srcObject = event.stream
}
2.發送offer
this.peerconn.addTransceiver('audio', { direction: 'recvonly' })
this.peerconn.addTransceiver('video', { direction: 'recvonly' })
this.peerconn.createOffer().then((offer) => {
this.peerconn.setLocalDescription(offer)
// 發送offer
let streamurl = `webrtc://${location.hostname}/${this.transmode}/${this.deviceid}`
this.sendrtcoffer(this.flvurl, this.flvurl, streamurl, null, offer.sdp)
3.收到回複,設定遠端sdp
sendrtcoffer (url, api, streamurl, clientip, sdp) {
HttpApi.sendoffer(url, api, streamurl, clientip, sdp).then((data) => {
this.peerconn.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: data.sdp })).catch(error => {
console.log(error)
})
})
}
最後我們的高性能realgbs平台下載下傳可以免費使用一年。下載下傳位址:點選下載下傳
更多資訊
多媒體技術交流QQ群: 222955665
wechat(tel): 13971177602
web:www.founu.com