23 votos

decodeAudioData API de Audio de HTML5

Quiero reproducir los datos de audio desde un ArrayBuffer... así que puedo generar mi matriz y rellenar con el microfone de entrada. Si extraigo estos datos en un lienzo parece --> enter image description here

Así que esto funciona!

Pero si quiero escuchar a este tipo de datos con

context.decodeAudioData(tmp, function(bufferN) { //tmp is a arrayBuffer
    var out = context.createBufferSource();
    out.buffer = bufferN;
    out.connect(context.destination);
    out.noteOn(0);
}, errorFunction);

Yo no se oye nada... porque el errorFunction se llama. Pero el error es nulo!

Yo también traté de conseguir el buffer como que:

var soundBuffer = context.createBuffer(myArrayBuffer, true/*make mono*/);

Pero me sale el error: Uncaught SyntaxError: invalid o ilegal de la cadena especificada.

alguien que me puede dar una pista ?

EDIT 1 (Más de código y de cómo llegar a la entrada de micrófono):

 navigator.webkitGetUserMedia({audio: true}, function(stream) {

                liveSource = context.createMediaStreamSource(stream);

                // create a ScriptProcessorNode
                if(!context.createScriptProcessor){
                   node = context.createJavaScriptNode(2048, 1, 1);
                } else {
                   node = context.createScriptProcessor(2048, 1, 1);
                }


                node.onaudioprocess = function(e){

               var tmp = new Uint8Array(e.inputBuffer.byteLength);
               tmp.set(new      Uint8Array(e.inputBuffer.byteLength), 0);

   //Here comes the code from above.

Usted puede ver la acción en vivo de la Captura de pantalla en http://dks-portal.de/audio/ (si usted tiene un micrófono y un navegador moderno como chrome) <-- demo no funciona porque de navegador cambios en el API

el código de arriba se encuentra en la cabecera de esta página index.html) demasiado (como comentario porque no su trabajo).

Gracias por su ayuda!

6voto

vzamanillo Puntos 3144

El error devuelto de la función de devolución de llamada es nulo porque en el actual webaudio api spec que la función no devuelve un error de objeto

callback DecodeSuccessCallback = void (AudioBuffer decodedData);
callback DecodeErrorCallback = void ();

    void decodeAudioData(ArrayBuffer audioData,
                         DecodeSuccessCallback successCallback,
                         optional DecodeErrorCallback errorCallback);

DecodeSuccessCallback se produce cuando la completa entrada ArrayBuffer se decodifica y se almacena internamente como un AudioBuffer pero por alguna razón desconocida decodeAudioData no puede decodificar una transmisión en vivo.

Usted puede tratar de jugar la captura de la configuración de búfer en el búfer de salida de datos cuando el procesamiento de audio

function connectAudioInToSpeakers(){

  //var context = new webkitAudioContext();  
  navigator.webkitGetUserMedia({audio: true}, function(stream) {

    var context = new webkitAudioContext();  
    liveSource = context.createMediaStreamSource(stream);

    // create a ScriptProcessorNode
    if(!context.createScriptProcessor){
       node = context.createJavaScriptNode(2048, 1, 1);
    } else {
       node = context.createScriptProcessor(2048, 1, 1);
    }


    node.onaudioprocess = function(e){

        try{
            ctx.clearRect(0, 0, document.getElementById("myCanvas").width, document.getElementById("myCanvas").height);
            document.getElementById("myCanvas").width = document.getElementById("myCanvas").width;
            ctx.fillStyle="#FF0000";

            var input = e.inputBuffer.getChannelData(0);
            var output = e.outputBuffer.getChannelData(0);
            for(var i in input) {
                output[i] = input[i];
                ctx.fillRect(i/4,input[i]*500+200,1,1);
            }


        }catch (e){
            console.log('node.onaudioprocess',e.message);
        }

    }

     // connect the ScriptProcessorNode with the input audio
    liveSource.connect(node);
    // if the ScriptProcessorNode is not connected to an output the "onaudioprocess" event is not triggered in chrome
    node.connect(context.destination);

    //Geb mic eingang auf boxen
    //liveSource.connect(context.destination);
  });
}

1voto

Cracker0dks Puntos 722

Después de un tiempo he tratado de resolver este problema de nuevo y se encontró una solución:

https://developer.mozilla.org/en-US/docs/Web/API/ScriptProcessorNode

No es complicado en absoluto, así que he creado un trabajo de violín:

http://jsfiddle.net/WEM3y/

Para activar su micrófono (probado en chrome v35) y comprobar que funciona.

La parte que más me han cambiado:

node.onaudioprocess = function(e){

    var outData = e.outputBuffer.getChannelData(0);
    var inData = e.inputBuffer.getChannelData(0);

    // Loop through the 4096 samples, copy them to output buffer
    for (var sample = 0; sample < e.outputBuffer.length; sample++) {
      // Set the data in the output buffer for each sample
      outData[sample] = inData[sample]; //Modify your buffer here if you want
    }
}

0voto

Thierry Marianne Puntos 1289

Inicialización de su contexto se podría hacer según lo recomendado por OJay en ¿por qué este código funciona en Safari pero no del cromo? Arrrgh

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X