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

Why is WebRTC remote video source generated by URL.createObjectURL

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

var offer = getOfferFromFriend();
navigator.getUserMedia({video: true}, function(stream) {
  pc.onaddstream = e => video.src = URL.createObjectURL(e.stream);
  pc.addStream(stream);

  pc.setRemoteDescription(new RTCSessionDescription(offer), function() {
    pc.createAnswer(function(answer) {
      pc.setLocalDescription(answer, function() {
        // send the answer to a server to be forwarded back to the caller (you)
      }, error);
    }, error);
  }, error);
});

我希望 video.src 是检索远程视频的地址。所以它应该由连接的另一方(发起呼叫的人)修复并给出。但是 URL.createObjectURL 的值是在应答者一方生成的,它的事件取决于调用函数的时间。如何使用它来获取远程视频流?

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

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

因为 WebRTC 连接涉及多个步骤,并且您从这样的连接中获得的是流。但是video标签的src属性不接受一个流,而是一个URL。这是 "convert" 流到 URL.

的方式

URL.createObjectURL(stream) 是一个 hack。停止使用它。正在努力 remove it.

直接使用video.srcObject = stream。它是标准的 well-implemented.

这种本地资源的分配一开始就不应该是 URL,并且是理解 WebRTC 工作原理的红鲱鱼。

WebRTC 是一种传输方式API,将数据直接从一个点发送到另一个点。不涉及 URL 内容。 onaddstream得到的远程stream是一个本地对象接收方,是传输的直播结果,可以播放了。

您阅读的文档陈旧且过时。谢谢指出,我会改正的。它还有其他问题:您应该立即调用 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 故障。