WebRTC/getUserMedia:如何正确静音本地视频?

WebRTC/getUserMedia:如何正确静音本地视频?,webrtc,getusermedia,Webrtc,Getusermedia,我正在尝试在我的WebRTC应用程序中实现禁用本地视频MediaStreamTrack的功能。以下是我的做法: function muteVideo() { if (this._localStream && this._localStream.getVideoTracks().length > 0) { this._localStream.getVideoTracks()[0].enabled = false; } } 在Firefox中,本地流所连接的元

我正在尝试在我的WebRTC应用程序中实现禁用本地视频
MediaStreamTrack
的功能。以下是我的做法:

function muteVideo() {
  if (this._localStream && this._localStream.getVideoTracks().length > 0) {
    this._localStream.getVideoTracks()[0].enabled = false;
  }
}
在Firefox中,本地流所连接的
元素在静音时正确呈现黑色。在Chrome中,不会渲染黑色,但图片会冻结。但是,在这两种浏览器中,相机的绿灯保持亮起,这显然是不希望出现的行为。(我想让我的用户看到,应用程序实际上是在视频静音时与摄像头断开连接的。)

如果我执行
此操作,相机的灯会熄灭。\u localStream.stop()
,但随后音频也会熄灭

媒体捕获规范的第二部分提到了
MediaStreamTrack.stop()
方法,但它目前似乎没有在Chrome和Firefox中实现

那么,有没有办法在以下情况下使本地视频静音:

  • 让相机的灯熄灭
  • 没有丢失音轨

  • 我认为您可以对getuser media提出两个请求:。这样你就可以真正阻止一条小溪。您还必须在用户之间使用多个对等连接,因为firefox不支持重新协商(在现有对等连接中添加或删除流)

    我们通过拆除本地媒体流并在没有视频曲目的情况下重新创建来解决此问题。在通话中执行此操作需要重新建立对等连接或执行重新协商(通过发送新报价触发)。

    今天
    track.stop()
    在Firefox中运行良好。铬在后面。指定结束轨迹的方式():

    navigator.mediaDevices.getUserMedia({video:true,audio:true})
    .then(stream=>video.srcObject=stream)
    .catch(e=>log(e.name+“:”+e.message));
    让stop=k=>video.srcObject.getTracks().map(t=>t.kind==k&&t.stop())
    

    停止录像
    停止播放音频
    谢谢。但根据WebRTC草案,
    MediaStreamTrack
    s如果属于不同的
    MediaStream
    s,则不必同步。我担心这会导致音频/视频同步问题。你是对的,这会导致同步问题。但唯一的熄灯方法是真正停止流(因此你必须在重新启动前再次请求许可),你应该能够使用
    stream.addTrack
    stream.removeTrack
    ,甚至
    新媒体流([videoTrack,audioTrack])
    (spec和Firefox,在Chrome的一个标志后面),将轨迹合并到新的流中。至少在理论上应该重新同步,但我还没有尝试。问题的关键是要找到一个解决方案,无论规范怎么说,它都能在今天起作用。3年后,规范的处理方式不起作用了。@jamix我给了你一种在保留音频的同时关闭视频的方法,而不需要在Firefox中重新提示许可。这比你在Firefox中会重新提示两次(一次是在视频消失时,另一次是在视频重新打开时)的自我回答要好。通过浏览器检测并组合这些答案,您应该能够找到在多个浏览器中运行良好的东西,直到浏览器赶上。不值得投反对票。是的,依赖浏览器的行为确实会让Firefox的用户体验更好,谢谢你的建议。我不能再取消否决票了,但如果你修改答案(相应地?),我可以取消否决票。