为什么WebRTC远程视频源由URL.createObjectURL生成

为什么WebRTC远程视频源由URL.createObjectURL生成,webrtc,Webrtc,在中,它使用URL.createObjectURL设置视频源。(这是接听电话的代码) 我希望video.src是检索远程视频的地址。因此,它应该是固定的,由连接的另一方(发起呼叫的人)提供。但是URL.createObjectURL的值是在应答者一侧生成的,它取决于调用函数的时间。如何使用它来获取远程视频流 编辑: URL.createObjectURL的结果看起来像blob:。有了这个字符串,视频组件如何知道在哪里加载远程流?是否有{url:stream}的hashmap存储在某处?如果是,视

在中,它使用
URL.createObjectURL
设置视频源。(这是接听电话的代码)

我希望video.src是检索远程视频的地址。因此,它应该是固定的,由连接的另一方(发起呼叫的人)提供。但是
URL.createObjectURL
的值是在应答者一侧生成的,它取决于调用函数的时间。如何使用它来获取远程视频流

编辑:
URL.createObjectURL
的结果看起来像blob:。有了这个字符串,视频组件如何知道在哪里加载远程流?是否有{url:stream}的hashmap存储在某处?如果是,视频组件如何访问hashmap


stream对象确实存储了一个令牌字符串,您可以使用
stream.toURL
获取该字符串。但是它与
URL.createObjectURL
的结果不同。
URL.createObjectURL
的值取决于时间。如果连续调用两次,则会得到不同的值。

因为WebRTC连接涉及多个步骤,并且从这样的连接中获得的是流。但是
video
标记的
src
属性不接受流,而是接受URL。这是将流“转换”为URL的方法。

URL。createObjectURL(流)
是一种黑客攻击。停止使用它。目前正在努力解决这一问题

直接使用。它是标准的,并且执行得很好

本地资源的这种分配在一开始就不应该是一个URL,这对于理解WebRTC的工作原理来说是一个麻烦

WebRTC是一种传输API,直接从一个对等点向另一个对等点发送数据。不涉及内容URL。从onaddstream获得的远程
是本地对象接收器端,是传输的实时流结果,可以播放

您阅读的文档已经过时。谢谢你指出,我会修好的。它还有其他问题:您应该立即调用setRemoteDescription,而不是等待接收者共享他们的相机,否则将错过传入的候选者。执行以下操作,而不是显示代码:

pc.onaddstream = e => video.srcObject = e.stream;

function getOfferFromFriend(offer) {
  return pc.setRemoteDescription(new RTCSessionDescription(offer))
    .then(() => navigator.getUserMedia({video: true}))
    .then(stream => {
      pc.addStream(stream);
      return pc.createAnswer();
    })
    .then(answer => pc.setLocalDescription(answer))
    .then(() => {
      // send the answer to a server to be forwarded back to the caller (you)
    })
    .catch(error);
}

它使用
srcObject
,避免了不推荐使用的回调API,并且不会导致间歇性ICE故障。

我知道您需要一个URL,但我不明白为什么会以这种方式生成URL。我需要自己编写
URL.createObjectURL
,因为它在React Native中不可用。因此,我尝试使用
stream.tour
,它生成一个不同于
URL.createObjectURL
生成的标记。视频组件似乎无法使用此令牌正确获取远程视频。
stream.tour
的值实际上对我来说更有意义,因为它不依赖于时间。
URL.createObjectURL
的结果看起来像
blob:http://some.site.com/xxxx-the-token-xxxx
。有了这个字符串,视频组件如何知道在哪里加载远程流?是否在某个地方存储了
{url:stream}
的hashmap?如果是,视频组件如何访问hashmap?此映射是浏览器的内部映射。我认为您无法以任何方式访问/控制它。如果是这种情况,则只能在调用
URL.createObjectURL
时更新此内部映射。听起来是一个非常奇怪的副作用…我认为实际上,从创建流的那一刻起,每个流都已经有了一个与之关联的URL。该方法仅为您检索。谢谢jib!这帮助我缩小了问题的原因。但我仍然无法找出我原来的问题。你能看看我的问题吗?我的iceConnectionState从
检查
跳到
关闭
。我不确定是什么导致了这个问题。
pc.onaddstream = e => video.srcObject = e.stream;

function getOfferFromFriend(offer) {
  return pc.setRemoteDescription(new RTCSessionDescription(offer))
    .then(() => navigator.getUserMedia({video: true}))
    .then(stream => {
      pc.addStream(stream);
      return pc.createAnswer();
    })
    .then(answer => pc.setLocalDescription(answer))
    .then(() => {
      // send the answer to a server to be forwarded back to the caller (you)
    })
    .catch(error);
}