我正在尝试将没有活动视频流的浏览器的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对象以识别传入的视频流?
我有一个解决方法:向信令添加“请求”事务,以允许无视频浏览器向具有视频功能的浏览器说“给我打电话”。但我希望有更优雅的东西。
答案 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;
警告! <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崩溃!