webrtc和peerjs:如何在不启动自己的流的情况下播放流?

webrtc和peerjs:如何在不启动自己的流的情况下播放流?,webrtc,peerjs,Webrtc,Peerjs,我在用皮夹子 媒体电话 var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; getUserMedia({video: true, audio: true}, function(stream) { var call = peer.call('another-peers-id', stream); call.on('stream', fu

我在用皮夹子

媒体电话

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
getUserMedia({video: true, audio: true}, function(stream) {
  var call = peer.call('another-peers-id', stream);
  call.on('stream', function(remoteStream) {
    // Show stream in some video/canvas element.
  });
}, function(err) {
  console.log('Failed to get local stream' ,err);
});
回答

var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
peer.on('call', function(call) {
  getUserMedia({video: true, audio: true}, function(stream) {
    call.answer(stream); // Answer the call with an A/V stream.
    call.on('stream', function(remoteStream) {
      // Show stream in some video/canvas element.
    });
  }, function(err) {
    console.log('Failed to get local stream' ,err);
  });
});
问题是:要获取remoteStream,我需要显示自己的流

var call = peer.call('another-peers-id', stream);

如何在不显示自己的流的情况下播放其他人的流?

这不是一个bug,您只是对WebRTC API的工作原理感到困惑。我们首先创建一个名为
getUserMedia
的函数变量,该变量将映射到浏览器提供的本机webrtc方法(例如,如果浏览器是Chrome,则method
navigator。getUserMedia
将分配给此变量,rest将为null。类似地,如果浏览器是Firefox,则本机method
navigator。mozGetUserMedia
将分配给此变量,rest将为null,依此类推)

将适当的本机方法分配给变量
getUserMedia
,然后使用适当的参数调用此方法。第一个参数是我们要创建的调用类型(即媒体约束),例如仅音频、音频+视频等。第二个参数是成功时的回调(即,当浏览器成功访问并连接到本地麦克风和/或摄像头等时)。此回调函数的一个示例是

function(stream) {
  var video = document.querySelector('video');
  video.srcObject = stream;
  video.onloadedmetadata = function(e) {
    // Do something with the video here.
  };
}
getUserMedia
方法有第三个参数,该参数是可选的,在示例代码中缺失,该参数是对另一个方法的回调,如果getUserMedia方法失败,该参数将启动。失败的原因可能有很多,例如,用户不允许浏览器访问本地麦克风或摄像头等。使用此回调我方法您可以通知用户有关呼叫失败的问题

下面是完整的示例代码(参考)

如果您不想发送自己的音频和/或视频,只需在媒体约束变量中将其设置为false


希望这有帮助。

这不是一个bug,您只是对WebRTC API的工作原理感到困惑。我们首先创建一个名为
getUserMedia
的函数变量,它将映射到浏览器提供的本机WebRTC方法(例如,如果浏览器是Chrome,则method
navigator。getUserMedia
将分配给此变量,rest将为null。类似地,如果浏览器是Firefox,则本机method
navigator。mozGetUserMedia
将分配给此变量,rest将为null,依此类推)

将适当的本机方法分配给变量
getUserMedia
,然后使用适当的参数调用此方法。第一个参数是我们要创建的调用类型(即媒体约束),例如仅音频、音频+视频等。第二个参数是成功时的回调(即,当浏览器成功访问并连接到本地麦克风和/或摄像头等时)。此回调函数的一个示例是

function(stream) {
  var video = document.querySelector('video');
  video.srcObject = stream;
  video.onloadedmetadata = function(e) {
    // Do something with the video here.
  };
}
getUserMedia
方法有第三个参数,该参数是可选的,在示例代码中缺失,该参数是对另一个方法的回调,如果getUserMedia方法失败,该参数将启动。失败的原因可能有很多,例如,用户不允许浏览器访问本地麦克风或摄像头等。使用此回调我方法您可以通知用户有关呼叫失败的问题

下面是完整的示例代码(参考)

如果您不想发送自己的音频和/或视频,只需在媒体约束变量中将其设置为false


希望这能有所帮助。

我试过使用getUserMedia({video:false,audio:false}…,但也有错误。我应该使用getUserMedia(false…only?啊,我知道你想建立双向通信,但只想单向发送媒体。这是标准的PTT(按键通话)设置。您只需将呼叫者SDP中相关媒体的媒体IP更改为0.0.0.0(例如,如果您希望接收视频但不发送视频,则将SDP的视频部分中的媒体IP设置为0.0.0)。还有另一种选择,与呼叫保持功能更相关,但也可以在此处使用。即,只需在SDP末尾添加或更新SDP属性,指示您只想接收媒体而不想发送媒体,例如,将“a=sendrecv”更改为“a=recvonly”。类似地,远程方可以在其响应SDP中添加/更新此属性,在这种情况下,该属性将为“a=sendonly”.好的。但是如何在peer.js中实现这一点呢?我怀疑PeerJS API是否有任何内置的方式来访问SDP,但可能您必须破解其代码来注入您的修改。以下是需要完成的基本理论。使用connection对象,需要创建本地提供(使用本机函数
createOffer
),成功时(如
getUserMedia
方法)运行一个回调函数,该函数生成offer作为其输入。在将
offer.sdp
设置为本地会话描述之前,您可以对其进行操作。我尝试了getUserMedia({video:false,audio:false}…,但也出现了错误。我应该使用getUserMedia吗(假…仅限?啊,我知道你想建立双向通信,但只想单向发送媒体。嗯,这是一个标准的PTT(按键通话)设置。你需要做的就是将呼叫者SDP中相关媒体的媒体IP更改为0.0.0.0(例如,如果您希望接收视频但不发送视频,则将SDP视频部分中的媒体IP设置为0.0.0.0)。还有另一种选择,与呼叫保持功能更相关,但也可以在此处使用。即,只需在SDP末尾添加或更新SDP属性,指示您只想接收媒体而不想发送媒体,例如,将“a=sendrecv”更改为“a=recvonly”。类似地,远程方可以在其响应SDP中添加/更新此属性,在这种情况下,该属性将为“a=sendonly”.好的。但是如何在peer.js中做到这一点呢?我怀疑PeerJS API是否有任何内置的方式来访问SDP,但可能您必须破解其代码来注入您的修改。以下是需要完成的基本理论。使用connection对象,需要创建本地提供(使用nativ)