Javascript 拒绝WebRTC报价的正确方式是什么?

Javascript 拒绝WebRTC报价的正确方式是什么?,javascript,webrtc,Javascript,Webrtc,在WebRTC中,似乎有一个非常明确的事件发生顺序。 在本地,我使用getUserMedia获取本地流,并将流保存到变量中。我创建了一个rtpeerconnection对象,我将其命名为pc,并将本地流添加到其中。我将一个onaddstream事件处理程序添加到pc,这样我就可以将远程用户的流保存到一个变量中,并最终将其设置为HTML元素(如audio)的src属性。我还在我的pc上设置onicecandidate事件处理程序来处理ice候选对象 此时,有一个rtpeerconnection,但

在WebRTC中,似乎有一个非常明确的事件发生顺序。 在本地,我使用
getUserMedia
获取本地流,并将流保存到变量中。我创建了一个
rtpeerconnection
对象,我将其命名为
pc
,并将本地流添加到其中。我将一个
onaddstream
事件处理程序添加到
pc
,这样我就可以将远程用户的流保存到一个变量中,并最终将其设置为HTML元素(如
audio
)的
src
属性。我还在我的
pc
上设置
onicecandidate
事件处理程序来处理ice候选对象

此时,有一个
rtpeerconnection
,但没有远程用户“连接”。这就是“提供/回答”的起点。假设我正在使用WebSocket发送信号,我收到了一条offer,这是一条名为“offer”的消息,其中包含一个SDP对象。我如何拒绝它,以及如何在两个端点上处理它

例如,我可以发送一条“拒绝”消息,该消息将转发给其他用户。我的RTPeerConnection仍然存在,也许我希望能够接收其他呼叫。照目前的情况,我不必对我的RTC对等连接做任何事情,对吗?发送报价的另一个用户需要做什么吗?他必须关闭特定的RTC对等连接吗?我认为不会,因为他所做的只是创建一个SDP对象,然后在WebRTC之外,通过websockets将该对象发送给另一个用户。不过,他确实使用了
setLocalDescription
添加了报价。当提议被拒绝时,他需要对此做些什么吗

当我创建一个报价并将其发送给另一个用户时,如果我从未得到回复,我是否可以将报价发送给第三个用户,然后如果他发送了一个回复,我就与他建立了联系

我没有发现任何关于RTPeerConnection生命周期的信息

拒绝介质的正确(规格)方法 回答中“拒绝”提供的媒体的“正确”方式尚未在任何浏览器中实现:

pc.ontrack = e => e.transceiver.stop();
基本上,WebRTC 1.0规范在这一领域中已经有所改进。简而言之,收发机是组合一个发送者和一个接收者的对象,每个发送者和接收者发送或接收单个磁道。
收发器.stop()
允许您拒绝信号SDP介质描述中的单个双向m线(协商介质)。你可以在回答中拒绝部分报价,而不拒绝全部报价

今天 今天,拒绝单个m线的唯一方法是手动修改SDP提供/应答

但听起来你根本没有问这个问题。相反,这听起来像是在问如何摆脱不完整的信令,并将对等连接回滚到“稳定”状态

回滚到稳定状态 报价/应答协商周期是一个复杂的过程。状态为pc.signalingState:

您问到,如果一方退出协商,那么任何一方都需要做些什么,然后才能重新确定其连接对象的用途,以便与相同或不同的对等方进行新的尝试。那要看情况了

如果您只调用了
createOffer
,则不需要回滚状态,因为上面的图中没有
createOffer

但是,如果您调用了
setLocalDescription
,那么您现在处于
“have local offer”
状态,这意味着您确实需要回到
“stable”
状态,然后才能重新使用连接

您可以选择完成协商、删除连接或回滚到稳定状态(目前仅在中,尽管它在规范中):

let pc=new rtpeerconnection();
pc.onnegotiationneeded=异步e=>{
试一试{
wait pc.setLocalDescription(wait pc.createOffer());
console.log(pc.signalingState);//本地提供
等待pc.setLocalDescription({type:“rollback”});
console.log(pc.signalingState);//稳定
}捕获(e){
控制台日志(e);
}
}
pc.createDataChannel(“虚拟”)