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 à -->
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!
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);
});
}
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:
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
}
}
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