Javascript Web Audio API AnalyserNode не работает при использовании AudioBufferSource - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь создать "автономную" эталонную версию алгоритма VAD, над которым я работаю.в онлайн-версии я использую createMediaStreamSource для ввода в узел анализатора, и он отлично работает.в автономной версии я хочу загрузить и разделить записанный аудиофайл, поэтому я использую xhr, чтобы загрузить файл как ArrayBuffer, а затем разделить его (чтобы он имитировал аудиопоток) и использовал его в качестве источника createBufferSource.

это код для разделения audioBuffer:

let audio_dur = audioBuffer.duration;

  let segments_num = Math.ceil(audio_dur / segment_dur);
  let segment_length = Math.ceil(audioBuffer.length / segments_num);
  segmentsArr = new Array(segments_num);

  let AudioData = new Float32Array(audioBuffer.length);
  AudioData = audioBuffer.getChannelData(0);


  for (let i = 0; i <= segments_num-1; i++){
    segmentsArr[i] = AudioData.slice(i*segment_length,(i+1)*segment_length-1);
  }

затем, часть для подключения его к анализатору:

const analyser = audioCtx.createAnalyser();
analyser.minDecibels = min_decibels;
analyser.fftSize = fft_size;

const T_data = new Float32Array(analyser.fftSize);
const F_data = new Uint8Array(analyser.frequencyBinCount);

let segments_num = segmentsArr.length;
let segment_length = segmentsArr[1].length;

var cur_Buffer = audioCtx.createBuffer(1, segment_length, audioCtx.sampleRate);

for (let segment_ind = 0; segment_ind <= segments_num-1; segment_ind++) {
  let cur_segment = segmentsArr[segment_ind];
  cur_Buffer.copyToChannel(cur_segment,0,0);

  let cur_source = audioCtx.createBufferSource();
  cur_source.loop = false;
  cur_source.buffer = newBuffer;

  cur_source.connect(analyser);

  analyser.getByteFrequencyData(F_data); // get current data
  analyser.getFloatTimeDomainData(T_data); // get current data
  ...

и код продолжается.

ПРОБЛЕМА IS: данные о времени и частоте, возвращаемые из анализатора, всегда пусты.

перед запросом: 1. minDecibels имеет значение -100Db (минимально возможное).2. сегментыArr не пустые, и я могу воспроизводить их по сегментам, используя точно такой же способ создания AudioBufferSource, а затем подключая его к месту назначения аудио.

ОТВЕТ: Благодаря @cwilso,проблема была в том, что я не использовал cur_source.start для каждого нового источника, большое спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

Из этого кода трудно понять, как именно он связан и код запускается.

1) Вы вызываете start () на исходных узлах буфера, верно?2) Вы вызываете getByteFrequencyData () и т. Д. После этого запуска?3) Вы слышите, как чанки буфера воспроизводятся через пункт назначения?

...