pixelstream-cn
Version:
基于虚幻引擎的像素流平台
103 lines (100 loc) • 3.52 kB
JavaScript
import wsSocket from "./websocket.js";
import webRtc from "./webrtc.js";
/**
* 通过设定信令服务地址和进度条对象
* 获得一个Promise对象
* 在then方法中获取webrtc对象
*/
export default class{
constructor(){
this.socket=null;
this.rtc=null;
}
message(messageHandel){
this.messageHandel=messageHandel;
return this;
}
start(sws,encodeKey,progress){
return new Promise((resolve,reject)=>{
progress.to(10);
let rtc = new webRtc();
this.rtc = rtc;
rtc.setDataChannelOpenHandel(e=>{
progress.to(90);
console.log("data channel open success");
resolve(rtc);
})
rtc.setDataChannelCloseHandel(e=>{
console.log("data channel close");
})
this.socket = new wsSocket();
this.socket.setMessageError(message=>{
if(this.messageHandel && this.messageHandel.errorHandel){
this.messageHandel.errorHandel(message);
}
progress.error(message);
reject(message);
});
this.socket.setMessageWait(num=>{
if(this.messageHandel && this.messageHandel.waitHandel){
this.messageHandel.waitHandel(num);
}
progress.wait(num);
});
this.socket.setMessageConfig(async msg=>{
progress.to(20);
let config = msg.peerConnectionOptions
//If this is true in Chrome 89+ SDP is sent that is incompatible with UE WebRTC and breaks.
config.offerExtmapAllowMixed = false;
config.sdpSemantics = 'unified-plan'
let offer = await rtc.init(config);
if(this.socket){
this.socket.send(offer)
}
})
//设置发送ice数据事件
rtc.setIceCandidateHandel(candidate=>{
if(this.socket){
this.socket.send({
type: 'iceCandidate',
candidate: candidate,
})
}
})
//设置websocket获取sdp answer处理事件
this.socket.setMessageAnswer(answer=>{
progress.to(50);
rtc.setAnswer(answer);
})
//设置websocket获取ice处理事件
this.socket.setMessageIceCandidate(msg=>{
rtc.setIceCandidate(msg.candidate);
})
rtc.setSpeedHandel(speed=>{
if(this.messageHandel && this.messageHandel.errorHandel){
this.messageHandel.speedHandel(speed);
}
// socket.send({
// type: 'speed',
// speed: speed,
// })
})
try {
this.socket.setHost(sws).setEncodeKey(encodeKey).run();
} catch (error) {
reject("信令服务连接失败")
return ;
}
});
}
close(){
if(this.socket){
this.socket.close();
this.socket=null;
}
if(this.rtc){
this.rtc.close();
this.rtc=null;
}
}
}