#google-chrome #firefox #webrtc
#google-chrome #firefox #webrtc
Вопрос:
Чтобы иметь возможность плавно переключаться с передней камеры на заднюю и наоборот во время установленного RTCPeerConnection, я использовал RTCRtpSender.replaceTrack() API следующим образом:
replaceMediaTracks = (mediaTracks: MediaStreamTrack[]) => {
if (!mediaTracks || mediaTracks.length < 1) {
throw this.errorFactory.createError('Failed to replace media tracks of RTC PC: No track to replace provided.');
}
this.peerConnections.forEach((peerConnection) => {
peerConnection.pc.getSenders().forEach((sender) => {
mediaTracks.forEach((track) => {
if (track.kind === sender.track.kind) {
sender.replaceTrack(track);
}
});
});
});
};
Я заметил, что на стороне приемника видео и аудиопоток будут воспроизводиться с некоторой дополнительной задержкой в течение короткого периода времени (прибл. от 1 до 2 минут) всякий раз, когда я заменяю дорожки. При поиске причины я выяснил, что jitterBufferDelay / jitterBufferEmittedCount, похоже, связано с этим феноменом, поскольку оно также увеличивается синхронно:
Есть ли какой-либо способ избежать задержки потока при замене дорожек, поскольку это приводит к ухудшению работы пользователя?
— Обновление и решение от 2020-09-06 —
Я также испытывал вышеупомянутую задержку видеопотока на стороне приемника в Firefox. Это может означать, что и в Firefox, и в Chrome есть ошибка. Я еще не создал сообщение об ошибке, поскольку я не уверен, ошибка это или нет. Тем не менее, я попытался сделать свою реальную цель переключения видео с передней камеры на заднюю и наоборот немного более эффективной, заменив только видеопоток вместо замены как видео, так и аудиопотока. С точки зрения кода это означает, что я вызываю replaceMediaTracks
следующим replaceMediaTracks(stream.getVideoTracks())
образом вместо replaceMediaTracks(stream.getTracks())
. Поток извлекается предыдущим вызовом navigator.mediaDevices.getUserMedia(...)
, и вуаля, задержка больше не возникает:
Я несколько раз переключал видеопоток между 19: 24 и 19:27, и в соотношении jitterBufferDelay / jitterBufferEmittedCount существенных изменений нет.
Так что это решение, которое полностью подходит для моего варианта использования.
Комментарии:
1. файл с ошибкой Chrome, это ненормальное поведение…
2. Это хороший момент, спасибо. Чтобы убедиться, что это происходит только с Chrome, я собираюсь также протестировать это с Firefox. Если этого не происходит, я собираюсь создать ошибку.
3. Привет, @PhilippHancke, такая же проблема возникает и в Firefox, что не дает мне понять, ошибка это или нет. Но я нашел решение, которое отлично подходит для моего варианта использования (см. Обновление в моем исходном сообщении).