gpt4 book ai didi

javascript - 将两个音频缓冲区叠加到一个缓冲区源中

转载 作者:太空狗 更新时间:2023-10-29 13:47:26 24 4
gpt4 key购买 nike

试图将两个缓冲区合并为一个;我已经能够从音频文件创建两个缓冲区并加载和播放它们。现在我需要将两个缓冲区合并为一个缓冲区。它们如何合并?

  context = new webkitAudioContext();
bufferLoader = new BufferLoader(
context,
[
'audio1.mp3',
'audio2.mp3',
],
finishedLoading
);

bufferLoader.load();

function finishedLoading(bufferList) {
// Create the two buffer sources and play them both together.
var source1 = context.createBufferSource();
var source2 = context.createBufferSource();
source1.buffer = bufferList[0];
source2.buffer = bufferList[1];

source1.connect(context.destination);
source2.connect(context.destination);
source1.start(0);
source2.start(0);
}

现在这些源分别加载,同时播放;但是如何将这两个源合并为一个缓冲区源呢?我不想附加它们,我想叠加/合并它们。

解释和/或片段会很棒。

最佳答案

在音频中,要两个音频流(此处为缓冲区)合二为一,您只需将每个样本值相加即可。实际上,我们可以根据您的代码段执行此操作:

/* `buffers` is a javascript array containing all the buffers you want
* to mix.
* `context` is an AudioContext or OfflineAudioContext */
function mix(buffers, context) {
/* Get the maximum length and maximum number of channels accros all buffers, so we can
* allocate an AudioBuffer of the right size. */
var maxChannels = 0;
var maxDuration = 0;
for (let i = 0; i < buffers.length; i++) {
if (buffers[i].numberOfChannels > maxChannels) {
maxChannels = buffers[i].numberOfChannels;
}
if (buffers[i].duration > maxDuration) {
maxDuration = buffers[i].duration;
}
}
var out = context.createBuffer(
maxChannels,
context.sampleRate * maxDuration,
context.sampleRate
);

for (var j = 0; j < buffers.length; j++) {
for (
var srcChannel = 0;
srcChannel < buffers[j].numberOfChannels;
srcChannel++
) {
/* get the channel we will mix into */
var output = out.getChanneData(srcChannel);
/* Get the channel we want to mix in */
var input = buffers[j].getChanneData(srcChannel);
for (let i = 0; i < input.length; i++) {
output[i] += input[i];
}
}
}
return out;
}

然后,简单地影响从这个函数返回到一个新的AudioBufferSourceNode.buffer,然后像往常一样播放它。

一些注意事项:为简单起见,我的代码片段假定:

  • 如果您有一个单声道缓冲器和一个立体声缓冲器,您将只能在混合缓冲器的左声道中听到单声道缓冲器。如果你想把它复制到左边和右边,你必须做的是称为up-mixing;
  • 如果您希望一个缓冲区比另一个缓冲区更安静或更响亮(例如,如果您移动调音台上的音量推子),只需将 toMix[i] 值乘以一个小于以下的数字即可1.0 使其更安静,大于 1.0 使其更响亮。

话又说回来,Web Audio API 为您做了所有这些,所以我想知道为什么您需要自己做,但至少现在您知道怎么做了:-)。

关于javascript - 将两个音频缓冲区叠加到一个缓冲区源中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22135056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com