Tengo una transmisión en vivo que se transmite a través de Icecast como audio/mpeg. Uso el siguiente código para tomar el audio de una transmisión en vivo para escuchar el audio:
function playLiveAudio() { // Fix up prefixing window.AudioContext = window.AudioContext || window.webkitAudioContext; var context = new AudioContext(); var offset = 0; var byteOffset = 0; var minDecodeSize = 4096; // This is your chunk size var request = new XMLHttpRequest(); request.onprogress = function(evt) { if (request.response) { var size = request.response.length - byteOffset; if (size < minDecodeSize) return; // In Chrome, XHR stream mode gives text, not ArrayBuffer. // If in Firefox, you can get an ArrayBuffer as is var buf; if (request.response instanceof ArrayBuffer) buf = request.response; else { ab = new ArrayBuffer(size); buf = new Uint8Array(ab); for (var i = 0; i < size; i++) buf[i] = request.response.charCodeAt(i + byteOffset) & 0xff; } byteOffset = request.response.length; context.decodeAudioData(ab, function(buffer) { playSound(buffer); }, function(error) { console.log(error); }); } }; request.onloadend = function(evt) { console.log(evt); }; request.open('GET', liveURL, true); request.responseType = "stream"; // 'stream' in chrome, 'moz-chunked-arraybuffer' in firefox, 'ms-stream' in IE request.overrideMimeType('text/plain; charset=x-user-defined'); request.send(null); function playSound(buffer) { source = context.createBufferSource(); // creates a sound source source.buffer = buffer; // tell the source which sound to play source.connect(context.destination); // connect the source to the context's destination (the speakers) source.start(offset); // play the source now // note: on older systems, may have to use deprecated noteOn(time); offset += buffer.duration; } }Intenté cambiar la transmisión a moz-chunked-arraybuffer y ver si podía manipular el búfer de audio, pero no parece hacer una diferencia: siempre recibo un rechazo de promesa de decodificación en Safari sin más mensajes, o un error de decodificación de datos de audio en Firefox.
Por alguna razón, solo funciona en Desktop Chrome; no funciona en ninguna versión de Firefox, Safari o Mobile Chrome. ¿Cómo se puede hacer que decodeAudioData() funcione en todos los entornos? En Firefox recibo el error: no se puede decodificarAudioData(). Puedo configurar un elemento de audio para transmitir en vivo la URL, pero luego hay un retraso de 8 segundos. Este código logra un retraso de 1 segundo.