Анализ звука без 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.