Ich versuche, einen Wellenformgenerator zu bauen, der Audiofile-Amplitudenwerte erhält und sie so schnell wie möglich (schneller als in Echtzeit) in Javascript anzeigt. Also benutze ich den OfflineAudioContext/webkitOfflineAudioContext, lade die Datei und starte die Analyse. Die Wellenform soll eine breite Leinwand füllen.OfflineAudioContext FFT-Analyse mit Chrom
Ich analysiere Puffer in einer Prozessor.AudioProzess-Funktion. (Ich denke, es ist die Art, wie es funktioniert?)
es funktioniert gut in Firefox, aber ich habe ein Problem in Chrom: es scheint es "springt" über viel Analyse zu beenden, es funktioniert so schnell wie möglich und gibt nur ein einige Koordinaten (etwa 16).
hier ist die jsfiddle: http://jsfiddle.net/bestiole/95EBf/
// create the audio context
if (! window.OfflineAudioContext) {
if (! window.webkitOfflineAudioContext) {
$('#output').append('failed : no audiocontext found, change browser');
}
window.OfflineAudioContext = window.webkitOfflineAudioContext;
}
//var context = new AudioContext();
var length = 15241583;
var samplerate = 44100;
var fftSamples = 2048;
var waveformWidth = 1920;
var context = new OfflineAudioContext(1,length,samplerate);
var source;
var splitter;
var analyser;
var processor;
var i=0;
var average;
var max;
var coord;
processor = context.createScriptProcessor(fftSamples, 1, 1);
processor.connect(context.destination);
analyser = context.createAnalyser();
analyser.smoothingTimeConstant = 0;
analyser.fftSize = fftSamples;
source = context.createBufferSource();
splitter = context.createChannelSplitter();
source.connect(splitter);
splitter.connect(analyser,0,0);
analyser.connect(processor);
context.oncomplete = function(){
$('#output').append('<br />complete');
}
var request = new XMLHttpRequest();
request.open('GET', "http://www.mindthepressure.org/bounce.ogg", true);
request.responseType = 'arraybuffer';
request.onload = function(){
$('#output').append('loaded ! ');
context.decodeAudioData(request.response, function(buffer) {
$('#output').append('starting analysis<br />');
processor.onaudioprocess = function(e){
var data = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(data);
average = getAverageVolume(data);
max = Math.max.apply(Math, data);
coord = Math.min(average*2,255);
coord = Math.round((max+coord)/2);
ctx.fillStyle=gradient;
ctx.fillRect(i,255-coord,1,255);
console.log(i+' -> '+coord);
i++;
}
source.buffer = buffer;
source.start(0);
context.startRendering();
}, onError);
}
request.send();
function onError(e) {
$('#output').append('error, check the console');
console.log(e);
}
function getAverageVolume(array) {
var values = 0;
var average;
var length = array.length;
for (var k = 0; k < length; k++) {
values += array[k];
}
average = values/length;
return average;
}
(hier ist eine andere Version, die Wellenform Kräfte in 1920px breit und erzeugen ein Wellenformdaten passen für die interessiert ist: http://jsfiddle.net/bestiole/E3rSx/)
ich wirklich nicht, Holen Sie sich den Punkt, wie Chrome nicht jeden Teil der Audiodatei behandelt?
danke für jede Hilfe!
Kann dies auch mit Canary 34 bestätigen. Es scheint eine Brute-Force zu sein, wenn der aktuelle Aufruf nicht in der Lage ist, innerhalb der gegebenen Zeit zu enden, aber das ist eine Vermutung. Wie verhält es sich, wenn Sie es in Echtzeit ausführen (normaler Kontext)? (Das Verschieben des Farbverlaufs fillStyle in den globalen Bereich ergibt ein etwas besseres Ergebnis.) – K3N
Es funktioniert gut in Echtzeit Kontext. Danke für den Fillstyle-Trick! – kro