Javascript 如何使用RTPeerConnection.removeTrack()删除视频或音频或两者?

Javascript 如何使用RTPeerConnection.removeTrack()删除视频或音频或两者?,javascript,webrtc,Javascript,Webrtc,我正在学习WebRTC,并试图弄清楚它是如何工作的 我在WebRTC.github.io上进行了修改,使getUserMedia成为leftVideo的源代码,并将其流式传输到rightVideo。它可以工作 我还想添加一些功能,比如当我在leftVideo上按pause时(我的浏览器是Chrome69) 我把电话号码分开 并在leftVideo上添加功能 leftVideo.onpause = () => { pc1Senders.map(sender => pc1.remov

我正在学习WebRTC,并试图弄清楚它是如何工作的

我在WebRTC.github.io上进行了修改,使getUserMedia成为leftVideo的源代码,并将其流式传输到rightVideo。它可以工作

我还想添加一些功能,比如当我在leftVideo上按pause时(我的浏览器是Chrome69)

我把电话号码分开

并在leftVideo上添加功能

leftVideo.onpause = () => {
  pc1Senders.map(sender => pc1.removeTrack(sender));
}
我不想关闭连接,我只想关闭视频或音频

但在我暂停leftVideo后,右边的视频仍会跟踪。 我是在这里做错了,还是在别的地方


感谢您的帮助。

首先,您需要获取对等方的流。您可以使用
MediaStreamTrack
enabled
属性禁用/隐藏流。使用下面的代码片段切换媒体

/* stream: MediaStream, type:trackType('audio'/'video') */
toggleTrack(stream,type) {
    stream.getTracks().forEach((track) => {
        if (track.kind === type) {
            track.enabled = !track.enabled;
        }
    });
}
找到所有的发送者

循环并移除每个发送轨道

添加新曲目(如果需要)

编辑:或者,如果您不需要重新协商(以下列出的条件),请使用
replaceTrack
()

并非所有轨道更换都需要重新协商。事实上,甚至 看似巨大的变化可以在不需要协商的情况下完成。在这里 可能引发谈判的变更是:

  • 新轨迹的分辨率超出了新轨迹的范围 当前轨迹的边界;也就是说,新轨道要么更宽,要么更宽 比现在的高

  • 新曲目的帧速率足够高 使编解码器的块速率被超过。这条新赛道是一条新的赛道 视频轨迹及其原始或预编码状态不同于 原来的轨道

  • 新曲目是一首音频曲目,具有不同的 原始的频道数

  • 内置 编码器(如硬件编码器)可能无法提供 协商编解码器。软件源可能无法实现协商的协议 编解码器


答案很好,但如果您仍然希望删除曲目而不是使其静音,那么RTC API的总体思路似乎是尽可能保留发送者。请注意,即使addTrack也会返回一个发送者——这应该是关于这个概念的一个提示。也许按种类对它们进行分类,只替换(不需要时移除)它们的轨迹是最有效的方法。我将测试这个,但这需要时间,我希望我会记得回到这里并添加一些印象。这是如此简单和有效!为什么会有这么多复杂的线程,这些线程都是关于pc.addTrack/removeTrack等的。Testen现在在android、chrome和firefox上运行。到处都能工作。向上投票。感谢您的支持,但这种方法存在一些问题,如果您使用enabled属性而不是removeTrack方法,则空气开启指示器将不会关闭。这不是一个真正的问题,但当你们打开你们的视频流时,所有视频聊天平台都会关闭指示灯,这对我的项目很有帮助。我投了赞成票。谢谢。@ShahnawazHossan很高兴我能帮上忙
/* stream: MediaStream, type:trackType('audio'/'video') */
toggleTrack(stream,type) {
    stream.getTracks().forEach((track) => {
        if (track.kind === type) {
            track.enabled = !track.enabled;
        }
    });
}
const senders = pc.getSenders();
senders.forEach((sender) => pc.removeTrack(sender));
newTracks.forEach((tr) => pc.addTrack(tr));