0

我编写了一个简单的应用程序,它从一个主服务器流向多个客户端。由于 Master 可能使用类似 IP 网络摄像头(具有约 1 秒延迟)但内部麦克风(无延迟)之类的东西,我想为音轨添加延迟。不幸的是,延迟似乎在 Firefox 上不起作用,在 chrome 上它自动将所有曲目同步到最高设置的 playoutDelayHint。所以一切都会延迟一秒钟。我检查了两个轨道的两个消费者 RTPreceivers 值,只有音频将 playoutDelayHint 设置为一秒,这不会随着时间而改变,但在流式传输几秒后,视频也会延迟一秒。

const stream = new MediaStream;
    [...]
let el = document.querySelector('#remote_video');
    [...]
function addVideoAudio(consumer) {
  if (consumer.kind === 'video') {
      el.setAttribute('playsinline', true);
      consumer._rtpReceiver.playoutDelayHint = 0;
  } else {
      el.setAttribute('playsinline', true);
      el.setAttribute('autoplay', true);
      consumer._rtpReceiver.playoutDelayHint = 1;
  }
    stream.addTrack(consumer.track.clone());
    el.srcObject = stream;
    el.consumer = consumer;
}

即使我添加了另一个视频元素和另一个媒体流,所以每个流(消费者)都得到它自己的 html 元素,我仍然得到相同的效果:

const stream1 = new MediaStream;
const stream2 = new MediaStream;
    [...]
let el1 = document.querySelector('#remote_video');
let el2 = document.querySelector('#remote_audio');
    [...]
function addVideoAudio(consumer) {
  if (consumer.kind === 'video') {
      el1.setAttribute('playsinline', true);
      consumer._rtpReceiver.playoutDelayHint = 0;
      stream1.addTrack(consumer.track);
      el1.srcObject = stream1;
      el1.consumer = consumer;
  } else {
      el2.setAttribute('playsinline', true);
      el2.setAttribute('autoplay', true);
      consumer._rtpReceiver.playoutDelayHint = 1;
      stream2.addTrack(consumer.track);
      el2.srcObject = stream2;
      el2.consumer = consumer;
  }
}

是否可以仅延迟一首曲目,为什么仅延迟(有点)在 chrome 上起作用?提前致谢。:)

4

1 回答 1

0

您可以使用 jitterBufferDelayHint 来延迟音频。

奇怪的是,视频上的 playoutDelayHint 会延迟视频和音频。但是仅延迟音频,似乎 jitterBufferDelayHint 修复了它。

audioReceiver.playoutDelayHint = 1;
audioReceiver.jitterBufferDelayHint = 1;

这种行为可能会随着时间而改变。

于 2021-02-14T02:31:01.957 回答