【发布时间】:2015-11-30 06:09:58
【问题描述】:
我正在尝试使用以下算法混合一些音频样本:
short* FilterGenerator::mixSources(std::vector<RawData>rawsources, int numframes)
{
short* output = new short[numframes * 2]; // multiply 2 for channels
for (int sample = 0; sample < numframes * 2; ++sample)
{
for (int sourceCount = 0; sourceCount < rawsources.size(); ++sourceCount)
{
if (sample <= rawsources.at(sourceCount).frames * 2)
{
short outputSample = rawsources.at(sourceCount).data[sample];
output[sample] += outputSample;
}
}
}
// post mixing volume compression
for (int sample = 0; sample < numframes; ++sample)
{
output[sample] /= (float)rawsources.size();
}
return output;
}
我得到了我想要的输出,除了当其中一个源完成后,其他源开始播放更响亮。我知道这是为什么,但我不知道如何正确解决。
另外,这是我输出的音频中 Audacity 的屏幕截图:
如您所见,肯定有问题。您可以看到音频在中心不再为零,并且一旦其中一个源播放完毕,您可以看到音频变得更响亮。
最重要的是我想解决音量问题,但非常感谢我能做的任何其他调整!
一些额外信息:我知道这段代码不允许单声道源,但没关系。我只会使用立体声交错音频样本。
【问题讨论】:
-
这不是一个完整的答案,但您应该分配一次缓冲区并重新使用它。您希望避免在性能关键代码中分配内存。 (我假设这是指向声卡而不是文件。)
-
这是指向一个文件。我正在非实时编辑音频。我知道我可以做一些更高效的事情,但这不是现在的问题。它现在可以非常快地完成我想要的操作
-
@JohnK:别出汗。现代分配器效率惊人,与 CPU 相比,音频速度非常慢。分配一个 1 kB 的缓冲区比播放它快一千倍。