Я пытаюсь создать "автономную" эталонную версию алгоритма 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
для каждого нового источника, большое спасибо.