decodeAudioData devuelve un error nulo

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

Específicamente, cada vez que bash utilizar el método decodeAudioData de un webkitAudioContext, siempre desencadena el controller 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, registra constantemente posts de error en la console diciendo err(decodeAudioData) = null , principalmente porque así es como decidí iniciar session. En cualquier caso, ¿alguna idea de por qué esto podría estar pasando?

Estoy usando Chrome Canary, v20.0.1121.0, para intentar que funcione algo. 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.

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

Faltan synchronization de flujo en el límite del encabezado que cualquier decodificador razonable de formatting de audio de transmisión debe comenzar. Y mp3 o muchos files aac / adts están transmitiendo formattings de file. la transmisión significa que puede cortarlos en cualquier lugar o insert cualquier cosa (varias tags incluso ilustraciones de imágenes). El decodificador no debería preocuparse por los datos desconocidos. El decodificador debería search hasta que encuentre un encabezado que conozca y pueda decodificar.

Lancé esta solución temporal que busca el inicio del encabezado de fotogtwig más cercano y solo transfiere datos de este desplazamiento.

Todos los mp3 o mp2 inician el encabezado de cada cuadro de audio (cada 200 bytes) con 0XFFE y aac (adts) en la palabra de synchronization de xFFF que está ahí solo por este motivo. por lo tanto, ambos se sincronizarán en 0xFFE. Aquí está el código que actualmente uso para reproducir files que anteriormente no se reproducían.

Lo que odio es que arrayBuffer no tenga subarray () como sus childs tipeados para devolver solo una vista diferente de un offset diferente en lugar de una copy de array nueva que slice () devuelve. si solo webaudio api aceptara typedarrays como input, pero desafortunadamente la única forma de crear un arraybuffer parece ser una gran copy de slice (). por suerte, generalmente solo se necesitan uno o dos bashs.

Obligar a Api de audio web a no ser quisquilloso con los files

 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(); } 

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

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

He quitado la cubierta y funciona de nuevo.

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