javascript - 使用AudioBufferSource时Javascript Web音频API AnalyserNode不起作用

标签 javascript html audio web-audio-api javascript-audio-api

我正在尝试构建我正在研究的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
  ...

然后代码继续。

问题是:从分析仪返回的时间数据和频率数据始终为空。

之前询问:
1. minDecibels为-100Db(最低)。
2. segmentArr不为空,我可以使用创建AudioBufferSource并将其连接到音频目标的完全相同的方法逐段播放。

回答:感谢@cwilso,问题在于我没有为每个新来源都使用cur_source.start
非常感谢。

最佳答案

从这段代码中很难确切看到它是如何连接的以及代码是如何开始的。

1)您正在缓冲源节点上调用start(),对吗?
2)您正在调用getByteFrequencyData()等启动之后发生吗?
3)您是否确实听到了通过目的地播放的缓冲块?

关于javascript - 使用AudioBufferSource时Javascript Web音频API AnalyserNode不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52594515/

相关文章:

javascript - AngularJS ng-options 在选择选项后删除了默认空白值

Javascript-所有嵌套forEach循环完成后的回调

html - 移动 HTML5 视频格式、视频大小和 FPS

javascript - JQuery - 如何根据值选择下拉项

javascript - express : I don't understand how to use sinon

jquery - 在 Internet Explorer 中获取图像的宽度和高度

html - Bootstrap Carousel 中的动画元素

html - 如何使用 Servlet 流式传输 MP3、MP4、AVI 等音频/视频文件

javascript - iOS Safari 一触后按顺序播放声音

javascript - HTML 和 Javascript 静音音频