使用WebRTC在远程浏览器中查看视频,本地浏览器永远不会获得ontrack事件

时间:2017-05-22 11:21:24

标签: google-chrome firefox html5-video webrtc video-capture

我正在尝试将没有活动视频流的浏览器的webRTC“呼叫”发送到具有此功能的浏览器。这个想法是允许原始浏览器查看接收浏览器的网络摄像头。

修改:我的特定应用程序仅针对单向视频调用 。不涉及音频流。

通过调用我指的是只有两个端点的点对点连接。

呼叫设置正确;提议/答案和候选交换协议正常运行。

但原始浏览器的RTCPeerConnection.ontrack事件处理程序永远不会被调用,以通过接收呼叫的浏览器宣布视频轨道。

翻转发起者和接收者的工作原理:如果我使用视频轨道从浏览器发起呼叫 - 也就是说,获取该浏览器的RTCPeerConnection对象以生成offer对象 - 他没有本地视频流的浏览器会获得ontrack事件。

这种情况发生在连接两端的Google Chrome和Firefox的所有组合中。 (Chrome 58.0.3029.110 64位,Firefox 53.0.2)

较旧的文档提到OfferToREceiveVideo作为pc.createOffer()方法的选项。但我不确定是否有效。较新的文档没有提到它。无论如何,包括或省略它似乎并不重要。

var offerOptions = {OfferToReceiveVideo: true, 
                    mandatory: {OfferToReceiveVideo: true}};

localPeerConnection.createOffer ( offerOptions )
    .then(
        function ( offer ) {
          localPeerConnection.setLocalDescription( offer );
          // send the offer to the far end via signaling server

        } )
    .catch(
        function ( error ) {
          trace( "error in createOffer", error );
        } );

编辑我也尝试过这个版本的选项对象,结果相同(负面)。

var offerOptions = {offerToReceiveVideo: true};

var offerOptions = {offerToReceiveVideo: true, offerToReceiveAudio: false};

没有成功。

我不理解的非对称视频webRTC连接是否有一些限制?我是否需要采取措施来欺骗原始RTCPeerConnection对象以识别传入的视频流?

我有一个解决方法:向信令添加“请求”事务,以允许无视频浏览器向具有视频功能的浏览器说“给我打电话”。但我希望有更优雅的东西。

1 个答案:

答案 0 :(得分:0)

您没有向我们展示代码中的错误。这应该可以正常工作(在Chrome中使用https小提琴):



Can't bind to 'appQuestionCollapser' since it isn't a known property of 'button'.("yQuestions" class="nav flex-column"> <li class="nav-item"> <button class="btn btn-link" [ERROR ->][appQuestionCollapser]="categoryQuestion[0].id"
&#13;
var pc1 = new RTCPeerConnection(), pc2 = new RTCPeerConnection();

var haveGum = navigator.mediaDevices.getUserMedia({video: true, audio: true});

pc1.ontrack = e => video1.srcObject = e.streams[0];
pc1.onicecandidate = e => pc2.addIceCandidate(e.candidate).catch(log);
pc2.onicecandidate = e => pc1.addIceCandidate(e.candidate).catch(log);
pc1.oniceconnectionstatechange = e => log(pc1.iceConnectionState);

pc1.createOffer({offerToReceiveAudio: true, offerToReceiveVideo: true})
  .then(d => pc1.setLocalDescription(d))
  .then(() => pc2.setRemoteDescription(pc1.localDescription))
  .then(() => haveGum)
  .then(stream => pc2.addStream(video2.srcObject = stream))
  .then(() => pc2.createAnswer()).then(d => pc2.setLocalDescription(d))
  .then(() => pc1.setRemoteDescription(pc2.localDescription))
  .catch(log);

var log = msg => div.innerHTML += "<br>" + msg;
&#13;
&#13;
&#13;

警告! <video id="video1" width="160" height="120" autoplay></video> <video id="video2" width="160" height="120" autoplay muted></video><br> <div id="div"></div> <script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>似乎导致Chrome崩溃!