Не удается получить два аудиопотока из navigator.mediaDevices.getUserMedia с Firefox

#javascript #firefox #audio #getusermedia

#javascript #firefox #Аудио #getusermedia

Вопрос:

Мне нужно записать видео (с помощью audiotrack) и другой аудиотрек с другого аудиовхода в моем сервисе. Запись со второго микрофона должна быть необязательной и контролироваться флажком.

Пожалуйста, проверьте это демо:

jsfiddle.net/x45h6cg3

 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.

Чтобы продемонстрировать это, вот две скрипты:

  1. Параллельно: https://jsfiddle.net/6co2eh0d /

    • Скрипка Kaiido с дополнительными журналами перед вызовом gUM. Показывает, что gUM вызывается, но не разрешается.
  2. Последовательный: 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);    
        })