Как (если вообще) можно использовать AnalyserNode для анализа всего аудиофайла и получения данных, необходимых для визуализации? - PullRequest
0 голосов
/ 27 января 2020

В частности, меня интересует метод AnalyserNode.getFloatTimeDomainData().

Можно ли использовать этот метод для создания сигнала, представляющего весь аудиофайл?

Или только AnalyserNode для аудиопотоков?

Документация MDN гласит:

Интерфейс AnalyserNode представляет узел, способный предоставлять информацию анализа частоты и временной области в реальном времени. Это AudioNode, который передает аудиопоток без изменений с входа на выход, но позволяет принимать сгенерированные данные, обрабатывать их и создавать аудиовизуализации.

https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode

Все примеры, кажется, используют AudioBuffer.getChannelData() с целью получения данных для визуализации всего аудиофайла. Как в этой статье:

https://css-tricks.com/making-an-audio-waveform-visualizer-with-vanilla-javascript/

Из артикула:

const filterData = audioBuffer => {
  const rawData = audioBuffer.getChannelData(0); // We only need to work with one channel of data
  const samples = 70; // Number of samples we want to have in our final data set
  const blockSize = Math.floor(rawData.length / samples); // the number of samples in each subdivision
  const filteredData = [];
  for (let i = 0; i < samples; i++) {
    let blockStart = blockSize * i; // the location of the first sample in the block
    let sum = 0;
    for (let j = 0; j < blockSize; j++) {
      sum = sum + Math.abs(rawData[blockStart + j]) // find the sum of all the samples in the block
    }
    filteredData.push(sum / blockSize); // divide the sum by the block size to get the average
  }
  return filteredData;
}

1 Ответ

0 голосов
/ 28 января 2020

В теме вы говорите, что у вас есть весь файл. Если это так, вы можете декодировать файл (decodeAudioData) и получить AudioBuffer со всеми семплами, которые затем сможете использовать для визуализации.

Если вы не можете декодировать весь файл в память вам придется использовать другой метод, и AnalyserNode, вероятно, не будет работать, потому что он асинхронный, поэтому вы можете не получить все образцы или получить дубликаты. Если это неприемлемо, возможно, вам придется использовать MediaStreamAudioSourceNode, подключенный к ScriptProcessorNode или AudioWorkletNode, чтобы получить нужные данные во временной области.

...