1. 程式人生 > 其它 >EasyRTC 通話報錯 `Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'`修復

EasyRTC 通話報錯 `Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'`修復

WebRTC的存在給線上視訊會議系統帶來了新的模式,TSINGSEE青犀視訊開發的網頁視訊會議系統EasyRTC綜合了webrtc和rtmp/rtsp方案的優點,支援一對一、一對多等視訊會議互動通話,滿足語音社交、線上教育和培訓、視訊會議和遠端醫療等場景,新的EasyRTC專案也即將和大家見面。

在測試 EasyRTC 新版的點對點通話功能時,出現報錯:Failed to execute ‘send’ on ‘RTCDataChannel’: RTCDataChannel.readyState is not ‘open’,並且不能將訊息成功的發給對方。

檢視程式碼如下:

//例項化傳送通道
sendChannel=localConnection.createDataChannel('webrtc-datachannel');
//onopen事件監聽
sendChannel.onopen=this.onSendChannelStateChange;
//onclose事件監聽
sendChannel.onclose=this.onSendChannelStateChange;

以上程式碼並未發現錯誤,因此懷疑是呼叫順序的問題導致。再次檢視程式碼,發現在傳送 offer 資訊之後,建立了對應的資料傳輸通道,問題點大概出現在此處。

為了解決該問題,我們將程式碼順序調整如下:

//例項化傳送通道
sendChannel=localConnection.createDataChannel('webrtc-datachannel');
//onopen事件監聽
sendChannel.onopen=this.onSendChannelStateChange;
//onclose事件監聽
sendChannel.onclose=this.onSendChannelStateChange;

try{
console.log('localConnection建立提議Offer開始');
//建立提議Offer
constoffer=awaitlocalConnection.createOffer();
//建立Offer成功
awaitthis.onCreateOfferSuccess(offer);
}catch(e){
//建立Offer失敗
this.onCreateSessionDescriptionError(e);
}

修改完畢後,可以正常傳送資訊。