2016-07-26 94 views
0

Ich versuche, einen unendlichen Stream aus der Abruf-API mit Chrome 51 zu spielen. (Ein Webcam-Audiostream wie Microsoft PCM, 16 Bit, Mono 11025 Hz)WebAudio Streaming mit Abruf: DOMException: Kann Audiodaten nicht decodieren

Der Code funktioniert mit mp3s Dateien fast OK, mit Ausnahme einiger Pannen, aber es überhaupt aus irgendeinem Grunde mit WAV-Dateien nicht funktioniert i „DOMException: nicht imstande, Audiodaten zu dekodieren“ erhalten wird

Der Code von diesem angepasst Antwort Choppy/inaudible playback with chunked audio through Web Audio API

Irgendeine Idee, wenn es möglich ist, es mit WAV-Streams arbeiten zu lassen?

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 ('/ Pfad/zu/mp3'), um den Code zu testen. (auf dem Server muss CORS aktiviert sein oder sich in der gleichen Domäne befinden, in der das Skript ausgeführt wird)

Antwort

0

Damit der wav-Stream korrekt klingt, bedeutet das, dass WAV-Header zu den Chunks hinzugefügt werden, wie Raymond vorgeschlagen hat, plus einige Webaudio-Zauber und Paquet-Ordering-Checks;

Einige coole Jungs hat mir geholfen, zu installieren, dass Modul nur, dass zu handhaben und es funktioniert wunderbar auf Chrome: https://github.com/revolunet/webaudio-wav-stream-player

Jetzt auf Firefox funktioniert 57+ mit einigen Config-Flags auf: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader#Browser_compatibility

+0

Warum funktioniert dieser Code nicht auf Firefox? –

+1

unterstützt mit einigen Flags auf: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader#Browser_compatibility – jujule

1

AudioContext.decodeAudioData ist nur nicht dafür ausgelegt, Teildateien zu decodieren; Es ist für "kurze" (aber komplette) Dateien gedacht. Aufgrund des chunkenden Designs von MP3 funktioniert es manchmal bei MP3-Streams, würde aber nicht bei WAV-Dateien funktionieren. In diesem Fall müssen Sie einen eigenen Decoder implementieren.

+1

oder eine WAV-Header vorangestellt wird zu jedem PCM-Datenstück vor dem Aufruf von 'decodeAudioData'. WAV-Header sind wirklich einfach. –

+0

Danke Raymond ... das klingt eine gute Lösung für mich ... irgendeine Idee, wie man diesen Header definiert und ihn den Chunks voranstellt? – jujule

+0

experimentieren mit dieser Idee hier: https://gist.github.com/revolunet/46d4187c3b6f28632a91421c1f2a9fad – jujule