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