Я добавляю задержку к входящему только для аудио потоку WebRT C, используя DelayNode
в Google Audio API в Google Chrome.
connectionRecv.onaddstream = (event) => {
const recvAudio = new Audio();
recvAudio.srcObject = event.stream.clone();
recvAudio.autoplay = true;
recvAudio.onloadedmetadata = () => {
// controls if original stream should also be played
// true causes WebRTC getStats() receive track audioLevel == 0
recvAudio.muted = muteOriginalStream;
const recvAudioSource = audioContext.createMediaStreamSource(recvAudio.srcObject as MediaStream);
const delayNode = audioContext.createDelay();
delayNode.delayTime.value = 1; // delay by 1 second
recvAudioSource.connect(delayNode);
delayNode.connect(audioContext.destination);
};
};
Это работа с одной маленькой проблемой. Я хочу отключить исходный поток, чтобы не слышать двойной звук (исходный поток и задержанный поток). Но когда я приглушаю исходный поток, чтобы слышать только задержанный поток, RTCPeerConnection
getStats()
возвращает 0 для дорожки приема audioLevel
.
Я пробовал много разных способов обвязки вокруг принятый поток, поэтому я слышу только задержанную версию, но либо вообще не слышу звука, либо getStats()
audioLevel
равен 0. Я ищу реализацию, которая сохраняет ненулевое значение audioLevel
из WebRT C getStats()
, пока через устройство вывода звука воспроизводится только задержанный поток. Проще говоря:
Как я могу воспроизвести только задержанный поток без обнуления WebRT C getStats()
приемный трек audioLevel
?
I Я создал минимальное воспроизведение проблемы на стеке здесь , где я создаю петлевое соединение WebRT C, где отправитель и получатель - это один и тот же браузер. Изучите журналы консоли, чтобы увидеть полученную дорожку audioLevel
, возвращенную с getStats()
.
Примечание: если вы используете мой стек-блиц, я предлагаю вам использовать наушники, чтобы избежать обратной связи l oop.