【问题标题】:Why is WebRTC remote video source generated by URL.createObjectURL为什么WebRTC远程视频源是由URL.createObjectURL生成的
【发布时间】:2017-01-25 05:27:02
【问题描述】:

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} 的哈希图是否存储在某处?如果是这样,视频组件如何访问哈希图?

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

【问题讨论】:

    标签: webrtc


    【解决方案1】:

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

    直接使用video.srcObject = stream。它是标准的且实施良好。

    这种本地资源的分配本来就不应该是一个 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故障。

    【讨论】:

    • 谢谢你!这帮助我缩小了问题的原因。但我仍然无法弄清楚我原来的问题。你能看看我的问题here吗?我的 iceConnectionState 从checking 跳转到closed。我不确定是什么导致了问题。
    【解决方案2】:

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

    【讨论】:

    • 我知道您需要一个 URL,但我不明白为什么会以这种方式生成 URL。我处于需要自己写URL.createObjectURL 的情况,因为它在 React Native 中不可用。所以我尝试使用stream.toURL,它产生的令牌与URL.createObjectURL 产生的不同。似乎视频组件无法使用此令牌正确获取远程视频。 stream.toURL 的值实际上对我来说更有意义,因为它不依赖于时间。
    • URL.createObjectURL 的结果看起来像blob:http://some.site.com/xxxx-the-token-xxxx。有了这个字符串,视频组件如何知道在哪里加载远程流? {url:stream} 的哈希图是否存储在某处?如果有,视频组件如何访问hashmap?
    • 此映射在浏览器内部。我认为您无法以任何方式访问/控制它。
    • 如果是这种情况,只有在调用URL.createObjectURL 时才能更新此内部映射。听起来很奇怪的副作用...
    • 我认为实际上从创建的那一刻起就已经有一个与每个流相关联的 URL。该方法只会为您检索它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多