【问题标题】:Mute/unmute individual WebRTC peer connections in Firefox在 Firefox 中静音/取消静音单个 WebRTC 对等连接
【发布时间】:2016-08-13 03:29:05
【问题描述】:

在我的应用中,我有多个打开的对等连接,我希望能够在对等连接级别上静音麦克风,而不是全局静音(就像 here 所做的那样)。

Chrome 很简单:

  • 静音时调用 removeStream
  • 取消静音时调用 addStream

否定:我了解我们正在朝着 addTrack/removeTrack 世界发展,因此该解决方案与其他浏览器和未来不兼容。

Firefox 根本不起作用:

  • removeTrack/addTrack 需要重新协商,这是不可接受的,因为这需要时间
  • replaceTrack 不需要重新协商,我的想法是有一个空的 MediaStreamTrack 用于静音,我可以用它来替换以前的 MediaStreamTrack。知道该怎么做吗?

或者,关于可行的 Firefox 解决方案/更酷的 Chrome 解决方案/统一方法的任何想法?

【问题讨论】:

  • 我不知道可以在 Chrome 中使用 add/removeStream 静音/取消静音。绝对不标准。
  • 它也需要重新协商......
  • 哦,你是对的。 clone() 绝对是 Chrome 的最佳方法。

标签: google-chrome firefox webrtc


【解决方案1】:

在 Firefox(和 Chrome,以及未来)中做到这一点的方法是克隆曲目,为您提供独立的 track.enabled 控件:

var track1, track2;

navigator.mediaDevices.getUserMedia({audio: true}).then(stream => {
  var clone = stream.clone();
  track1 = stream.getAudioTracks()[0];
  track2 = clone.getAudioTracks()[0];
})

var toggle = track => track.enabled = !track.enabled;

在下面试试(在 Chrome 中使用 https fiddle):

var track1, track2;

navigator.mediaDevices.getUserMedia({audio: true}).then(stream => {
  var clone = stream.clone();
  track1 = stream.getAudioTracks()[0];
  track2 = clone.getAudioTracks()[0];
  return Promise.all([spectrum(stream), spectrum(clone)]);
}).catch(e => console.log(e));

var toggle = track => track && (track.enabled = !track.enabled);

var spectrum = stream => {
  var audioCtx = new AudioContext();
  var analyser = audioCtx.createAnalyser();
  var source = audioCtx.createMediaStreamSource(stream);
  source.connect(analyser);

  var canvas = document.createElement("canvas");
  var canvasCtx = canvas.getContext("2d");
  canvas.width = window.innerWidth/2 - 20;
  canvas.height = window.innerHeight/2 - 20;
  document.body.appendChild(canvas);

  var data = new Uint8Array(canvas.width);
  canvasCtx.strokeStyle = 'rgb(0, 125, 0)';

  setInterval(() => {
    canvasCtx.fillStyle = "#a0a0a0";
    canvasCtx.fillRect(0, 0, canvas.width, canvas.height);

    analyser.getByteFrequencyData(data);
    canvasCtx.lineWidth = 2;
    data.forEach((y, x) => {
      y = canvas.height - (y / 128) * canvas.height / 4;
      var c = Math.floor((x*255)/canvas.width);
      canvasCtx.fillStyle = "rgb("+c+",0,"+(255-x)+")";
      canvasCtx.fillRect(x, y, 2, canvas.height - y)
    });

    analyser.getByteTimeDomainData(data);
    canvasCtx.lineWidth = 5;
    canvasCtx.beginPath();
    data.forEach((y, x) => {
      y = canvas.height - (y / 128) * canvas.height / 2;
      x ? canvasCtx.lineTo(x, y) : canvasCtx.moveTo(x, y);
    });
    canvasCtx.stroke();
    var bogus = source; // avoid GC or the whole thing stops
  }, 1000 * canvas.width / audioCtx.sampleRate);
};
<button onclick="toggle(track1)">Mute A</button>
<button onclick="toggle(track2)">Mute B</button><br>
<script src="https://webrtc.github.io/adapter/adapter-latest.js"></script>

然后将这两个轨道馈送到不同的对等连接。这也适用于视频静音。

【讨论】:

  • 太好了,我们可以将它用于 Chrome。在 Firefox 中,MediaStream.clone() 仅在两周前与 FF48 一起引入。你看到 FF47 及以下的选项了吗?
  • @nexus 你可以使用replaceTrack(在FF34中添加)来切换禁用的fake(一个Firefox的东西)轨道。
  • 太棒了,我找不到这个!谢谢:-)
猜你喜欢
  • 2020-06-30
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多