bugfix
This commit is contained in:
parent
97da5deefe
commit
0db3f732a7
@ -208,11 +208,11 @@ bricks.RTCP2PConnect = class {
|
||||
return this.signal_handlers[typ];
|
||||
}
|
||||
|
||||
async p2pconnect(peer, role){
|
||||
async p2pconnect(peer){
|
||||
await this.getLocalStream();
|
||||
var p = this.peers[peer.id];
|
||||
if (!p){
|
||||
await this.createPeerConnection(peer, role);
|
||||
await this.createPeerConnection(peer);
|
||||
} else {
|
||||
aconsole.log(peer, 'connect exists', this);
|
||||
}
|
||||
@ -241,7 +241,7 @@ bricks.RTCP2PConnect = class {
|
||||
}
|
||||
}
|
||||
async h_callaccepted(data){
|
||||
await this.send_offer(data.msgfrom);
|
||||
await this.send_offer(data.msgfrom, true);
|
||||
}
|
||||
async h_offer(data){
|
||||
console.log('h_offer(), this=', this, 'peer=', data.msgfrom);
|
||||
@ -255,7 +255,7 @@ bricks.RTCP2PConnect = class {
|
||||
answer:pc.localDescription,
|
||||
msgto:data.msgfrom
|
||||
});
|
||||
if (this.peers[data.msgfrom.id].role == 'responser'){
|
||||
if (this.peers[data.msgfrom.id].role != 'requester'){
|
||||
await this.send_offer(data.msgfrom);
|
||||
}
|
||||
|
||||
@ -274,9 +274,14 @@ bricks.RTCP2PConnect = class {
|
||||
var pc = this.peers[data.msgfrom.id].pc;
|
||||
pc.close();
|
||||
}
|
||||
async send_offer(peer){
|
||||
async send_offer(peer, initial){
|
||||
console.log('send_offer(), peers=', this.peers, 'peer=', peer);
|
||||
var pc = this.peers[peer.id].pc;
|
||||
if (initial){
|
||||
this.peers[peer.id].role = 'requester';
|
||||
} else {
|
||||
this.peers[peer.id].role = 'responser';
|
||||
}
|
||||
var offer = await pc.createOffer();
|
||||
await pc.setLocalDescription(offer);
|
||||
var d = {
|
||||
@ -321,7 +326,6 @@ bricks.RTCP2PConnect = class {
|
||||
|
||||
async connection_statechange(peer, event){
|
||||
var pc = this.peers[peer.id].pc;
|
||||
var role = this.peers[peer.id].role;
|
||||
console.log(`${peer.id} state changed. new state=${pc.connectionState}`);
|
||||
console.log('state=', pc.connectionState, typeof(pc.connectionState));
|
||||
if (pc.connectionState == 'disconnected'){
|
||||
@ -332,8 +336,7 @@ bricks.RTCP2PConnect = class {
|
||||
}
|
||||
if (pc.connectionState == 'connected'){
|
||||
console.log('state is connected, data_connect=',
|
||||
this.opts.data_connect,
|
||||
'role=', role);
|
||||
this.opts.data_connect);
|
||||
}
|
||||
}
|
||||
|
||||
@ -371,7 +374,7 @@ bricks.RTCP2PConnect = class {
|
||||
await this.opts.on_dc_close(dc);
|
||||
}
|
||||
}
|
||||
async createPeerConnection(peer, role){
|
||||
async createPeerConnection(peer){
|
||||
const configuration = {
|
||||
iceServers:this.opts.ice_servers
|
||||
}
|
||||
@ -385,7 +388,7 @@ bricks.RTCP2PConnect = class {
|
||||
}
|
||||
this.peers[peer.id] = bricks.extend({}, peer);
|
||||
this.peers[peer.id].pc = pc;
|
||||
this.peers[peer.id].role = role;
|
||||
this.peers[peer.id].role = '';
|
||||
var remoteVideo = new bricks.VideoBox();
|
||||
this.peers[peer.id].video = remoteVideo;
|
||||
if (role == 'requester'){
|
||||
@ -405,6 +408,20 @@ bricks.RTCP2PConnect = class {
|
||||
remoteVideo.set_stream(event.streams[0]);
|
||||
}
|
||||
}
|
||||
async changeLocalVideoStream(peer, new_stream){
|
||||
var pc = this.peers[peer.id].pc,
|
||||
const senders = pc.getSenders();
|
||||
const oldVideoTrackSender = senders.find(sender => sender.track && sender.track.kind === 'video');
|
||||
if (oldVideoTrackSender) {
|
||||
pc.removeTrack(oldVideoTrackSender);
|
||||
}
|
||||
new_stream.getTracks().forEach(track => {
|
||||
if (track.kind === 'video') {
|
||||
pc.addTrack(track, newStream);
|
||||
}
|
||||
});
|
||||
await this.send_offer(peer, true);
|
||||
}
|
||||
async getLocalStream() {
|
||||
if (this.opts.media_options){
|
||||
try {
|
||||
@ -415,7 +432,33 @@ bricks.RTCP2PConnect = class {
|
||||
} catch (error) {
|
||||
console.error('获取本地媒体流失败:', error);
|
||||
}
|
||||
try {
|
||||
this.local_screen = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: false });
|
||||
} catch (error) {
|
||||
console.error('获取本地Screen失败:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
peer_close(peer){
|
||||
var pc = this.peers[peer.id].pc;
|
||||
var video = this.peers[peer.id].video;
|
||||
pc.getReceivers().forEach(receiver => {
|
||||
if (receiver.track){
|
||||
receiver.track.stop();
|
||||
}
|
||||
});
|
||||
pc.getSenders().forEach(receiver => {
|
||||
if (receiver.track){
|
||||
receiver.track.stop();
|
||||
}
|
||||
});
|
||||
video.srcObject.getTracks().forEach(track => track.stop());
|
||||
var dc = this.peers[peer.id].dc;
|
||||
if (dc){
|
||||
dc.close();
|
||||
}
|
||||
pc.close();
|
||||
self.peers = {k:v for k,v in self.peers if k!=peer.id};
|
||||
}
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user