javascript 如何使用RTCPeerConnection.removeTrack()删除视频或音频或两者都删除?

ws51t4hk  于 2023-01-19  发布在  Java
关注(0)|答案(3)|浏览(384)

我正在研究WebRTC,并试图弄清楚它是如何工作的。
我在www.example.com上修改了this sampleWebRTC.github.io,使getUserMedia成为leftVideo的源,并流传输到rightVideo。
我想添加一些功能,比如当我按下左视频暂停时(我的浏览器是Chrome 69)
我改变了Call()的部分

...
stream.getTracks().forEach(track => {
    pc1Senders.push(pc1.addTrack(track, stream));
});
...

并在left上添加功能Video

leftVideo.onpause = () => {
  pc1Senders.map(sender => pc1.removeTrack(sender));
}

我不想关闭连接,我只想关闭视频或音频。
但是在我暂停leftVideo之后,rightvideo仍然会得到跟踪。我在这里做错了吗,或者是其他地方?
谢谢你的帮助。

093gszye

093gszye1#

首先,你需要得到对等体的流,你可以使用MediaStreamTrackenabled属性来静音/隐藏流,使用下面的代码片段来切换媒体。

/* stream: MediaStream, type:trackType('audio'/'video') */
toggleTrack(stream,type) {
    stream.getTracks().forEach((track) => {
        if (track.kind === type) {
            track.enabled = !track.enabled;
        }
    });
}
o4tp2gmn

o4tp2gmn2#

const senders = pc.getSenders();
senders.forEach((sender) => pc.removeTrack(sender));
newTracks.forEach((tr) => pc.addTrack(tr));

获取所有发件人;
循环并删除每个发送轨道;
添加新的轨道(如果需要);
编辑:或者,如果不需要重新协商(条件如下所列),则使用replaceTrackhttps://developer.mozilla.org/en-US/docs/Web/API/RTCRtpSender/replaceTrack)。
并非所有的轨道更换都需要重新谈判。事实上,即使是看似巨大的改动也可以不需要谈判而完成。以下是可能引发谈判的改动:

  • 新轨迹具有在当前轨迹的边界的边界之外的分辨率;即新轨道比当前轨道宽或高。
  • 新轨道的帧速率高到足以导致超过编解码器的块速率。新轨道是视频轨道,其原始或预编码状态与原始轨道的状态不同。
  • 新轨道是通道数与原始轨道不同的音频轨道。
  • 具有内置编码器(如硬件编码器)的媒体源可能无法提供协商的编解码器。软件源可能无法实现协商的编解码器。
hyrbngr7

hyrbngr73#

async switchMicrophone(on) {
    if (on) {
        console.log("Turning on microphone");
        const stream = await navigator.mediaDevices.getUserMedia({audio: true});
        this.localAudioTrack = stream.getAudioTracks()[0];

        const audioSender = this.peerConnection.getSenders().find(e => e.track?.kind === 'audio');
        if (audioSender == null) {
            console.log("Initiating audio sender");
            this.peerConnection.addTrack(this.localAudioTrack); // will create sender, streamless track must be handled on another side here
        } else {
            console.log("Updating audio sender");
            await audioSender.replaceTrack(this.localAudioTrack); // replaceTrack will do it gently, no new negotiation will be triggered
        }
    } else {
        console.log("Turning off microphone");
        this.localAudioTrack.stop(); // this will turn off mic and make sure you don't have active air-on indicator
    }
}

这是简化的代码。解决了本主题中描述的大多数问题。

相关问题