#javascript #firefox #audio #getusermedia
#javascript #firefox #Аудио #getusermedia
Вопрос:
Мне нужно записать видео (с помощью audiotrack) и другой аудиотрек с другого аудиовхода в моем сервисе. Запись со второго микрофона должна быть необязательной и контролироваться флажком.
Пожалуйста, проверьте это демо:
function getMediaWithConstraints(audioSource, videoSource) {
// webrtc does supports only fixed sizes for firefox 16:9 ratio.
let w = 640;
let h = 360;
let constraints = {
audio: { deviceId: audioSource ? { exact: audioSource } : undefined },
video: {
deviceId: videoSource ? { exact: videoSource } : undefined,
aspectRatio: 1.7777777778,
width: { min: w, max: w, ideal: w },
height: { min: h, max: h, ideal: h }
}
};
navigator.mediaDevices.getUserMedia(constraints)
.then(gotStream).catch(errorCallback);
}
function getSecondMediaWithConstraints(secondAudioSource) {
let audioConstraints = {
video: false,
audio: { deviceId: secondAudioSource ? { exact: secondAudioSource } : undefined }
};
navigator.mediaDevices.getUserMedia(audioConstraints)
.then(gotSecondStream)
.catch(errorCallback);
}
Это отлично работает в Chrome, но выдает ошибку MediaStreamError AbortError «Сбой запуска звука» в Firefox. Необходима поддержка Firefox.
Для тестирования вам нужно как минимум два аудиовхода.
Кто-нибудь может помочь с правильной инициализацией потока в Firefox?
Комментарии:
1. На самом деле у меня нет времени копаться в вашем коде, но выполнение первого запроса на одобрение пользователя перед выполнением enumerateDevices и initStreams делает мой FF счастливым (также после устранения чрезмерных ограничений моя камера не может отображать этот размер) jsfiddle.net/pf9q7utv
2. @Kaiido, спасибо за ваш ответ! Теперь я вижу ошибку только в одной конкретной комбинации камеры и микрофона, но в целом это работает. похоже, проблема в устройстве.
Ответ №1:
В Firefox есть ошибка (протестирована с версией 67.0), из-за которой вы не можете одновременно получать аудиопотоки с двух разных микрофонов (ссылка: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038). Похоже, это и есть причина вашей проблемы.
В ответ на оригинал и скрипты @Kaiido (… я не могу комментировать): Они предоставляют вводящие в заблуждение результаты, потому что обещания getUserMedia не всегда выполняются. Ошибка не возникает, потому что вызов gUM выполняется не так, как ожидалось. Похоже, это связано с тем, что одновременно есть два ожидающих вызова gUM.
Чтобы продемонстрировать это, вот две скрипты:
-
Параллельно: https://jsfiddle.net/6co2eh0d /
- Скрипка Kaiido с дополнительными журналами перед вызовом gUM. Показывает, что gUM вызывается, но не разрешается.
-
Последовательный: https://jsfiddle.net/73dqbs1p /
- Скрипка Kaiido, но с двумя последовательными вызовами gUM. Показывает, что при разрешении gUM для другого аудиоустройства возникает ошибка.
// Call gUM one after the other, rather than having them done in parallel. getMediaWithConstraints(audioDeviceSelected, videoDeviceSelected) .then(() => { getSecondMediaWithConstraints(audioSecondDeviceSelected); })