您可以通过编写自己的自定义 IWaveProvider/WaveStream 来做到这一点,其输出 WaveFormat 具有三个通道。它包含对您的三个输入文件中的每一个的引用。然后,在 Read 方法中,它计算出请求的样本数量,并从每个源文件中读取适当的数量。然后需要对样本进行交错 - 一个来自第一个文件,一个来自第二个文件,一个来自第三个文件。要延迟,您只需输入零。
这是一些未经测试的示例代码,它们从各种源文件(必须都具有相同的位深度和采样率)中交错,希望能够为您指明正确的方向:
int Read(byte[] buffer, int offset, int bytesRequired)
{
int bytesPerSample = this.WaveFormat.BitsPerSample / 8;
int samplesRequired = bytesRequired / bytesPerSample;
int channels = this.WaveFormat.Channels; // 3
int samplesPerChannel = samplesRequired / channels;
byte[] readBuffer = new byte[samplesPerChannel * bytesPerSample];
for (int channel = 0; channel < channels; channel++)
{
int read = inputs[channel].Read(readBuffer, 0, samplesPerChannel * bytesPerSample);
int outOffset = offset + channel * bytesPerSample;
for (int i = 0; i < read; i += bytesPerSample)
{
Array.Copy(readBuffer, i, buffer, outOffset, bytesPerSample);
outOffset += channels * bytesPerSample;
}
}
}
为了防止代码变得过于复杂,您可以通过创建另一个派生的 IWaveProvider / WaveStream 来插入静音,其 Read 方法返回适当数量的静音,然后从输入文件返回真实数据。然后可以将其用作交错 WaveStream 的输入。