我编写了一个简单的应用程序,它从一个主服务器流向多个客户端。由于 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 上起作用?提前致谢。:)