合并多个音频缓冲源

Posted

技术标签:

【中文标题】合并多个音频缓冲源【英文标题】:merge multiple audio buffer sources 【发布时间】:2012-12-04 18:21:54 【问题描述】:

关于html5 webaudio的问题:是否可以将多首歌曲合并在一起?

我有不同的轨道,它们都使用 webaudio 同时播放,但我需要处理音频,所以我需要一个缓冲区内的所有音频,而不是每个轨道都有自己的缓冲区。

我尝试通过添加他们的频道数据来合并它们,但我总是得到“Uncaught RangeError: Index is out of range.”

function mergeBuffers(recBuffers, recLength)

  var result = new Float32Array(recLength*2);
  var offset = 0;
  for (var i = 0; i < recBuffers.length; i++)
    result.set(recBuffers[0], offset);
    offset += recBuffers[0].length;
  
  return result;


var recBuffersL = [];
for (var i=0;i<audioTracks.length; i++)

    recBuffersL[i] = audioTracks[i].currentBuffer.getChannelData(0);



var recBuffersR = [];
for (var i=0;i<audioTracks.length; i++)

    recBuffersR[i] = audioTracks[i].currentBuffer.getChannelData(1);




var buffers = [];
buffers.push( mergeBuffers(recBuffersL, recBuffersL.length) );
buffers.push( mergeBuffers(recBuffersR, recBuffersR.length) );

【问题讨论】:

您在使用网络音频 API 吗?您可以根据需要将任意数量的源连接到 AudioContext.destination, 是的;但我正在处理,所以在将音频发送到我想要操作它的音频上下文之前 【参考方案1】:

事实证明这是可能的: 我必须对 Float32Array 求和

【讨论】:

【参考方案2】:

您可以使用 OfflineAudioContext 并取回结果缓冲区。这将使您能够比实时更快地处理 + 合并。

【讨论】:

【参考方案3】:

我会将两个来源的输出连接到 ScriptProcessorNode 并实时处理它们。

【讨论】:

以上是关于合并多个音频缓冲源的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Web Audio API 中更改音频缓冲源的时间?

ffmpeg文档35-音频源

ffmpeg学习——音频源

用于预加载整个流的 Html 音频标签

具有多个视频帧的 DirectShow 变换过滤器 - 与音频同步

在 Ubuntu Linux 上操作音频输入缓冲区