arraybuffor в аудио src

#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. Спасибо, что дали мне знать. Я обновил ответ. У меня сложилось впечатление, что в этом не должно быть необходимости.