Czy można użyć węzła {X0}} w offlineAudioContext, aby wykonać analizę częstotliwości?

Dowiedziałem się, że ScriptProcessor "s onaudioprocess zdarzenia nadal pożary w offlineAudioContext i był to jedyny źródło zdarzenia, którego mógłbym użyć do wywołania getByteFrequencyData Analyser Węzeł. Jak poniżej:

var offline = new offlineAudioContext(1, buffer.length, 44100);
var bufferSource = offline.createBufferSource();
bufferSource.buffer = buffer;

var analyser = offline.createAnalyser();
var scp = offline.createScriptProcessor(256, 0, 1);

bufferSource.connect(analyser);
scp.connect(offline.destination); // this is necessary for the script processor to start

var freqData = new Uint8Array(analyser.frequencyBinCount);
scp.onaudioprocess = function(){
    analyser.getByteFrequencyData(freqData);
    console.log(freqData);
   // freqData is always the same.
};

bufferSource.start(0);
offline.startRendering();

Problemem jest to, że macierz freqData jest zawsze taki sam i nigdy się nie zmienia. Wydaje się, że tak, jakby analizuje tylko jedną część bufora.

Czy robię coś złego? Lub Analyser nie ma być użyte w offlineContext.

A oto Fiddle z tym samym kodem.

4
zya 18 sierpień 2014, 21:12

2 odpowiedzi

Najlepsza odpowiedź

Analizator nie jest naprawdę przeznaczony do użycia w Offlinecontext; W rzeczywistości początkowo nazywano "realtimeanseryser". Ale nawet ważniejsze, teraz nie otrzymasz konsekwentnej funkcjonalności z procesorów skryptów w kontekstach offline.

1
cwilso 18 sierpień 2014, 19:58

Alternatywą jest użycie metod suspend i resume dostępne dla OfflineAudioContext. Po zawieszeniu można użyć węzła analizatora, aby uzyskać żądany czas i / lub dane domeny częstotliwości. Ponieważ kontekst jest zatrzymany, to działa dobrze. Jeśli zamierzasz to zrobić kilka razy, musisz zaplanować zatrzymanie na następny raz przed wznowieniem.

Niestety, Afaik, tylko chrom został zaimplementowany suspend dla OfflineAudioContext

2
Raymond Toy 22 maj 2018, 23:13