Анализ звука без getUserMedia

Я пытаюсь проанализировать вывод звука из браузера, но не хочу, чтобы появлялось приглашение getUserMedia (которое запрашивает разрешение микрофона). Источниками звука являются SpeechSynthesis и Mp3-файл. Вот мой код:

return navigator.mediaDevices.getUserMedia({
        audio: true
      })
      .then(stream => new Promise(resolve => {
        const track = stream.getAudioTracks()[0];
        this.mediaStream_.addTrack(track);
        this._source = this.audioContext.createMediaStreamSource(this.mediaStream_);
        this._source.connect(this.analyser);
        this.draw(this);

      }));

Этот код работает нормально, но запрашивает разрешение на использование микрофона! Мне совершенно не интересен микрофон, мне нужно только измерить аудио выход. Если я проверю все доступные устройства:

navigator.mediaDevices.enumerateDevices()
.then(function(devices) {
  devices.forEach(function(device) {
    console.log(device.kind + ": " + device.label +
            " id = " + device.deviceId);
  });
})

Я получаю список доступных устройств в браузере, включая "audiooutput". Итак, есть ли способ направить аудиовыход в медиапоток, который затем может быть использован внутри функции 'createMediaStreamSource'? Я проверил всю документацию по аудио API, но не смог ее найти. Спасибо всем, кто может помочь!

1 ответ

Существуют различные способы получить MediaStream, исходящий из gUM, но вы не сможете перехватить все возможные аудиовыходы...

Но для вашего mp3-файла, если вы читаете его через MediaElement (<audio> или же <video>), и если этот файл обслуживается без нарушения CORS, то вы можете использовать MediaElement.captureStream, Если вы читаете его из WebAudioAPI, или если вы нацелены на браузеры, которые не поддерживают captureStream затем вы можете использовать https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/createMediaStreamDestination.

Для SpeechSynthesis, к сожалению, вам понадобится gUM... и виртуальное аудиоустройство: сначала вам нужно будет установить выход по умолчанию на VAB_out, затем направить ваш VAB_out на VAB_in и, наконец, получить VAB_in из gUM...

Не простая и не универсально выполнимая задача, более того, когда в IIRC SpeechSynthesis нет метода setSinkId.

Другие вопросы по тегам