WebAudio-Streaming mit Fetch: DOMException: Audio-Daten können nicht decodiert werden

Ich versuche, mit Chrome 51 einen unendlichen Stream von der Fetch-API abzuspielen. (Ein Webcam-Audiostream als Microsoft PCM, 16 Bit, Mono 11025 Hz)

Der Code funktioniert mit mp3s-Dateien fast einwandfrei, außer bei einigen Störungen. Bei wav-Dateien funktioniert er jedoch aus irgendeinem Grund nicht. "DOMException: Audio-Daten können nicht dekodiert werden".

Der Code wird aus dieser Antwort übernommen Abgehackte / unhörbare Wiedergabe mit Audio-Chunks über die Web Audio API

Kann ich mir vorstellen, ob es mit WAV-Streams funktioniert?

function play(url) {
  var context = new (window.AudioContext || window.webkitAudioContext)();
  var audioStack = [];
  var nextTime = 0;

  fetch(url).then(function(response) {
    var reader = response.body.getReader();
    function read() {
      return reader.read().then(({ value, done })=> {
        context.decodeAudioData(value.buffer, function(buffer) {
          audioStack.push(buffer);
          if (audioStack.length) {
              scheduleBuffers();
          }
        }, function(err) {
          console.log("err(decodeAudioData): "+err);
        });
        if (done) {
          console.log('done');
          return;
        }
        read()
      });
    }
    read();
  })

  function scheduleBuffers() {
      while ( audioStack.length) {
          var buffer    = audioStack.shift();
          var source    = context.createBufferSource();
          source.buffer = buffer;
          source.connect(context.destination);
          if (nextTime == 0)
              nextTime = context.currentTime + 0.01;  /// add 50ms latency to work well across systems - tune this if you like
          source.start(nextTime);
          nextTime += source.buffer.duration; // Make the next buffer wait the length of the last buffer before being played
      };
  }
}

Verwenden Sie einfach play ('/ path / to / mp3'), um den Code zu testen. (Auf dem Server muss CORS aktiviert sein, oder er muss sich in derselben Domäne befinden, von der aus Sie das Skript ausführen.)

Antworten auf die Frage(4)

Ihre Antwort auf die Frage