2014-01-09 7 views
8

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!

+0

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

+0

Es funktioniert gut in Echtzeit Kontext. Danke für den Fillstyle-Trick! – kro

Antwort

1

Chrome hat einen Fehler in Skriptprozessoren im Offline-Modus.

+0

Ich bekomme das gleiche Problem in Safari, ich denke, es ist ein Webkit/blink Sache. , die durch https bestätigt wird: http://bugs.webkit.org/show_bug.cgi?id=113274 und http://lists.w3.org/Archives/Public/public-audio/2013JulSep/0110.html: die wichtigsten Audio-Thread wartet nicht auf den Prozessor, um seine Aufgaben zu berechnen, bevor mit dem nächsten Block von Beispielrahmen fortgefahren wird ... zu schlecht Ich kann einen bestätigten Fehlerbericht noch nicht finden. danke für deine antwort – kro

+0

hast du jemals einen fehlerbericht gefunden? Immer noch Probleme beim Rendern eines Oszillators in Chrome v36. Funktioniert perfekt in der neuesten Firefox V30. –

+0

Fehlerbericht in Chromium, ich brauche wirklich dies zu arbeiten, frage ich mich, wenn es gelöst wird: https://code.google.com/p/chromium/issues/detail?id=374339 – janesconference