Невозможно получить два аудиопотока от navigator.mediaDevices.getUserMedia с Firefox - PullRequest
0 голосов
/ 05 марта 2019

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

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

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 Ответ

0 голосов
/ 03 июня 2019

В Firefox есть ошибка (протестированная с v67.0), из-за которой вы не можете получать аудиопотоки от двух разных микрофонов одновременно (ссылка: https://bugzilla.mozilla.org/show_bug.cgi?id=1238038).. .


В ответ на оригинал и скрипки @ Kaiido (... я не могу комментировать): они дают вводящие в заблуждение результаты, потому что обещания getUserMedia не всегда выполняются. Ошибка не происходит, потому что вызов gUM не выполняется, как ожидалось. Похоже, это связано с тем, что одновременно ожидают два вызова gUM.

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

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

    • Скрипка Кайидо, с дополнительными журналами перед вызовом gUM. Показывает, что gUM вызывается, но не разрешается.
  2. Последовательный: https://jsfiddle.net/73dqbs1p/

    • Скрипка Кайидо, но с двумя последовательными вызовами gUM. Показывает, что при разрешении gUM для другого аудиоустройства возникает ошибка.
    // Call gUM one after the other, rather than having them done in parallel.
    getMediaWithConstraints(audioDeviceSelected, videoDeviceSelected)
        .then(() => {
            getSecondMediaWithConstraints(audioSecondDeviceSelected);    
        })
    
...