#javascript #html5-audio #audio-streaming #web-audio-api
Вопрос:
Я получаю arraybuffer из http-ответа. Приведенный ниже код воспроизводит звук только один раз, но я хочу использовать аудио в качестве src для звукового элемента!
this.toSpeechService.getAudioFile(this.text).subscribe(res => {
const context = new AudioContext();
let source = context.createBufferSource();
context.decodeAudioData(res, function(buffer) {
source.buffer = buffer;
}, null).then(() => {
source.connect(context.destination);
this.audioSrc = context.destination; // doesn't fill the audio player
source.start(0);
});
console.log(res)
});
<audio controls="controls">
<source [src]="audioSrc" type="audio/mp3/wav" />
Your browser does not support the audio element.
</audio>
Комментарии:
1. Можете ли вы настроить JSFiddle?
Ответ №1:
В случае, если вы знаете, что тип mime данных в ArrayBuffer
следующем должен работать.
this.toSpeechService.getAudioFile(this.text).subscribe(res => {
const blob = new Blob([ res ], { type: THE_MIME_TYPE });
const url = URL.createObjectURL(blob);
YOUR_AUDIO_ELEMENT.src = url;
YOUR_AUDIO_ELEMENT.load();
});
THE_MIME_TYPE
является заполнителем для фактического мимеТипа. И YOUR_AUDIO_ELEMENT
является ссылкой на ваш аудиоэлемент.
Как только вам больше не понадобится URL-адрес объекта, вы можете освободить память, позвонив URL.revokeObjectURL(url)
.
Комментарии:
1. Это создает URL-адрес ( локальный хост:4200/afad9eca-0385-4bab-9ac2-47aaced43b2b ), но мой аудиоэлемент по-прежнему пуст и ничего не воспроизводит!
2. URL-адрес выглядит так, как и ожидалось. Что означает «пустой» в данном случае? Позволяет ли это вам нажать кнопку воспроизведения? Вы установили миметип?
3. На самом деле вашему коду просто нужен YOUR_AUDIO_ELEMENT.load(); в конце и звуковой элемент воспроизводит звук. Спасибо за вашу помощь.
4. Спасибо, что дали мне знать. Я обновил ответ. У меня сложилось впечатление, что в этом не должно быть необходимости.