tutorial the play examples abstracting javascript html5 google-chrome webkit web-audio

javascript - the - decodeAudioData devolviendo un error nulo



web audio api play mp3 (3)

Vengo aquí con la esperanza de que ustedes, gente encantadora, de aquí para poder ayudarme con un pequeño problema que estoy teniendo.

Específicamente, cada vez que intento usar el método decodeAudioData de un webkitAudioContext, siempre se activa el controlador de errores con un error nulo. Este es el código que estoy usando actualmente:

var soundArray; var context = new webkitAudioContext(); function loadSound(soundName) { var request = new XMLHttpRequest(); request.open(''GET'',soundName); request.responseType = ''arraybuffer''; request.onload = function() { context.decodeAudioData(this.response, function(buf) { sounds[soundName] = buf; },function(err) { console.log("err(decodeAudioData): "+err); }); } request.send(); }

En este punto, constantemente registra mensajes de error en la consola que dicen err(decodeAudioData) = null , principalmente porque así fue como decidí registrarlo. En cualquier caso, ¿alguna idea de por qué esto podría estar pasando?

Estoy usando Chrome Canary, v20.0.1121.0, para intentar que algo funcione. Pero, obviamente, no está funcionando! Entonces, ¿alguna idea de lo que podría hacer? Si se necesita información nueva, avíseme y la actualizaré según sea necesario.


Estaba usando webkitAudioContext con Chrome 19. Hoy he actualizado a Chrome 20 y tengo el mismo problema que tú.

He tomado otro archivo MP3 y funciona de nuevo. La única diferencia entre los dos archivos es la cubierta incrustada en el archivo MP3 incorrecto.

He quitado la tapa y vuelve a funcionar.


Estoy teniendo el mismo problema que tú solo en el iPhone 4 con iOS7. Probé esta solución y todavía nada. ¿Es el archivo en sí o no tiene nada que ver con el arraybuffer cargado?


La verdadera razón es que tanto createBuffer como decodeAudioData ahora tienen un error y lanzan una extraña y vaga excepción de DOM 12 para los archivos que normalmente deberían reproducir. Pero debemos ser conscientes de que esta es una tecnología nueva y en evolución y agradecer incluso por la API de audio de la web como lo es ahora desde su pequeño milagro que nos sucedió.

Faltan sincronización de flujo en el límite del encabezado con el que debería comenzar cualquier decodificador razonable de formato de audio de transmisión. Y los archivos mp3 o aac / adts están transmitiendo formatos de archivo. la transmisión significa que puede cortarlos en cualquier lugar o insertar el decodificador adjuntar cualquier cosa (varias etiquetas, incluso ilustraciones de imagen), sin importarles los datos desconocidos. El decodificador solo debe buscar hasta que encuentre el encabezado que conoce y puede decodificar.

Junté esta solución temporal que busca el inicio del encabezado del fotograma más cercano y solo pasa los datos de este desplazamiento.

Todos los encabezados de inicio de mp3 o mp2 para cada fotograma de audio (cada alrededor de 200 bytes) con 0XFFE y aac (anuncios) en la palabra clave oxFFF están ahí solo por este motivo. por lo tanto, ambos se sincronizarán en 0xFFE. Aquí está el código que uso actualmente para reproducir archivos que no se han reproducido anteriormente.

Lo que odio es que arrayBuffer no tiene subarray () como sus hijos escritos para devolver solo una vista diferente desde un offset diferente en lugar de una copia de array completamente nueva, que slice () devuelve. si solo webaudio api aceptara typedarrays como entrada, pero desafortunadamente la única forma de crear arraybuffer back es una copia de slice () enorme. Afortunadamente, generalmente solo se necesitan una o dos búsquedas.

Obligando a Web Audio Api a no ser exigente con los archivos

node={}; node.url=''usual_mp3_with_tags_or_album_artwork.mp3''; function syncStream(node){ // should be done by api itself. and hopefully will. var buf8 = new Uint8Array(node.buf); buf8.indexOf = Array.prototype.indexOf; var i=node.sync, b=buf8; while(1) { node.retry++; i=b.indexOf(0xFF,i); if(i==-1 || (b[i+1] & 0xE0 == 0xE0 )) break; i++; } if(i!=-1) { var tmp=node.buf.slice(i); //carefull there it returns copy delete(node.buf); node.buf=null; node.buf=tmp; node.sync=i; return true; } return false; } function decode(node) { try{ context.decodeAudioData(node.buf, function(decoded){ node.source = context.createBufferSource(); node.source.connect(context.destination); node.source.buffer=decoded; node.source.noteOn(0); }, function(){ // only on error attempt to sync on frame boundary if(syncStream(node)) decode(node); }); } catch(e) { log(''decode exception'',e.message); } } function playSound(node) { node.xhr = new XMLHttpRequest(); node.xhr.onload=function(){ node.buf=node.xhr.response; node.sync=0; node.retry=0; decode(node); } node.xhr.open("GET", node.url, true); node.xhr.responseType = "arraybuffer"; node.xhr.send(); }