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.)