decodeAudioData HTML5 API Audio

je veux lire les données audio d'un ArrayBuffer... donc je génère mon tableau et je le remplis avec une entrée microfone. Si je dessine ces données sur une toile il ressemble à --> enter image description here

donc ça marche!

Mais si je veux écouter ces données avec

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

je n'entends rien... parce que le errorFunction est appelé. Mais l'erreur est nulle!

j'ai aussi essayé d'obtenir le tampon comme que:

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

mais j'obtiens l'erreur: Uncaught SyntaxError: une chaîne invalide ou illégale a été spécifiée.

qui peut me donner un indice ?

EDIT 1 (Plus de code et comment j'arrive à l'entrée micro):

 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.

Merci pour votre aide!

22
demandé sur Cracker0dks 2013-10-31 23:45:45

3 réponses

l'erreur retournée par la fonction de rappel est nulle parce que dans le courant api webaudio spec cette fonction ne renvoie pas une erreur d'objet

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

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

Decodesuccallback Decodesucc est soulevé lorsque le tableau d'entrées complet est décodé et stocké en interne comme un AudioBuffer, mais pour une raison inconnue decodeAudioData ne peut pas décoder un flux en direct.

vous pouvez essayer de jouer le tampon capturé sortie de données de tampon lors du traitement 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);
  });
}
5
répondu vzamanillo 2013-12-20 13:34:59

Après un certain temps, j'ai essayé de résoudre ce problème et trouvé une solution:

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

ce n'est pas compliqué du tout, donc j'ai créé un violon de travail:

https://jsfiddle.net/WEM3y /

alors activez votre micro (testé sur chrome v35) et vérifiez-le.

le partie i ont changé:

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
    }
}
1
répondu Cracker0dks 2016-02-04 14:46:31

votre initialisation du contexte pourrait être faite comme recommandé par OJay dans pourquoi ce code fonctionne-t-il en Safari mais pas en Chrome? Arrrgh

0
répondu Thierry Marianne 2017-05-23 10:30:13