Gibt es einen Weg, um die Web-Audio-API zum Beispiel audio schneller als in Echtzeit?
Ich bin Herumspielen mit der Web Audio API & versucht, einen Weg finden, importieren Sie eine mp3 (also das ist nur bei Chrome), und generieren Sie eine Wellenform auf einer Leinwand. Kann ich dies in Echtzeit, aber mein Ziel ist, diese schneller als in Echtzeit.
Allen Beispielen, die ich habe finden können, beinhalten Lesen Sie den Frequenz-Daten aus einer Analysator-Objekt in eine Funktion angebracht die onaudioprocess Veranstaltung:
processor = context.createJavascriptNode(2048,1,1);
processor.onaudioprocess = processAudio;
...
function processAudio{
var freqByteData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(freqByteData);
//calculate magnitude & render to canvas
}
Scheint es aber, dass analyser.frequencyBinCount
wird nur aufgefüllt, wenn der sound abgespielt wird (etwas über der Puffer gefüllt wird).
Was ich will, ist in der Lage sein manuell/programmatisch Schritt für Schritt durch die Datei so schnell wie möglich zu generieren Leinwand Bild.
Was ich habe, so weit ist diese:
$("#files").on('change',function(e){
var FileList = e.target.files,
Reader = new FileReader();
var File = FileList[0];
Reader.onload = (function(theFile){
return function(e){
context.decodeAudioData(e.target.result,function(buffer){
source.buffer = buffer;
source.connect(analyser);
analyser.connect(jsNode);
var freqData = new Uint8Array(buffer.getChannelData(0));
console.dir(analyser);
console.dir(jsNode);
jsNode.connect(context.destination);
//source.noteOn(0);
});
};
})(File);
Reader.readAsArrayBuffer(File);
});
Aber getChannelData() gibt immer eine leere typisiertes array.
Jede Einsicht wird geschätzt - auch wenn es stellt sich heraus, es kann nicht getan werden. Ich glaube, ich bin der einzige, der das Internet nicht wollen, um Dinge zu tun, in Echtzeit.
Dank.
- schneller als Echtzeit?
- ya - schneller als in Echtzeit. Wie in, wenn die Dauer der Strecke beträgt 5 Minuten, ich will nicht 5 Minuten zu warten, bis das Signal erzeugt. Ich möchte, um es zu verarbeiten, so schnell wie möglich (hoffentlich wenigen Sekunden)
- füllen Sie die
Uint8Array
falsch. Finden Sie eine funktionierende Lösung hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist eine wirklich erstaunliche 'offline' - Modus der Web-Audio-API, mit der Sie vor der Verarbeitung eine ganze Datei durch eine audio-Kontext tun, und dann etwas mit dem Ergebnis:
Also das setup sieht genau die gleiche wie die Verarbeitung in Echtzeit-Modus, außer Sie richten die
oncomplete
Rückruf und der AufrufstartRendering()
. Das, was Sie wieder ine.redneredBuffer
ist einAudioBuffer
.set source.buffer = buffer
wo kommtbuffer
kommen? Der einzige Ort, ich kann sehen, ein AudioBuffer erstellt wird, ist als argument für den Erfolg Funktion im Kontext.decodeAudioData(). Hier ein jsfiddle, was ich habe. Es ist ein komplettes Chaos, aber seine wo ich bin - ziemlich stechend in der Dunkelheit. jsfiddle.net/NW7E3 Stellen Sie sicher, dass Sie die Konsole activebuffer
ist einAudioBuffer
, dass Sie aus derdecodeAudioData
oncomplete
callback:var context = new webkitAudioContext();
. Im wesentlichen, ich denke, Sie müssen einen Kontext schaffen, zum spielen und einen Rahmen für die Verarbeitung.source.noteOn(0)
aufgerufen wird. Was ist es, das löst die Verarbeitung, wennstartRendering()
verwendet wird? Hast du irgendwelche Unterlagen dazu? Ich konnte nichts finden, außer die patch-notes. JSFiddle von real-time-Verarbeitung: jsfiddle.net/QpzQm/10 JSFiddle von meine beste Schätzung, wie startRendering() verwendet wird (was aber eigentlich nichts macht), jsfiddle.net/9TEKGmediaElementSourceNode
? stackoverflow.com/questions/11292076/...webkitAudioContext
Konstruktor mit ein paar zusätzliche Argumente, aber das funktioniert nur auf dem Mac. Fehler treten in Windows und Linux.Habe ich diese arbeiten mit OfflineAudioContext mit dem folgenden code. Das komplette Beispiel hier zeigt, wie es zu verwenden, um die Berechnung der FFT-Magnituden für einen linearen chirp. Sobald Sie haben das Konzept der Haken die Knoten zusammen, können Sie fast alles offline.