gpt4 book ai didi

.net - 如何在 C# 中使用 NAudio 将 3 个 wav 文件加入到具有 3 个 channel 的单个文件中?

转载 作者:行者123 更新时间:2023-12-03 10:02:47 28 4
gpt4 key购买 nike

使用 C# 和 NAudio,我有三个 wave 文件,我想加入一个具有三个 channel 的 wave 文件,每个 channel 对应三个输入文件之一。此外,我希望每个 wave 文件的音频剪辑在最终流中的不同点开始。例如,如果三个波形文件的长度分别为 3 秒、5 秒。和 2 秒,输出波形文件分别为 10 秒长和...

  • channel 1 包含来自文件 1 的 3 秒声音,然后是 7几秒钟的沉默。

  • channel 2 包含 3 秒的静音,然后是 5 秒的静音来自文件 2 的声音,然后是 2 秒的静默。

  • channel 3 包含 8 秒的静音,然后是 2 秒的静音来自文件 3 的声音。

我一直在尝试为每个文件创建一个 WaveChannel32 实例,然后使用 WaveOffsetStream 类,但我对这类事情不熟悉,而且我没有取得太大的成功。

有人有什么建议吗?

最佳答案

您可以通过编写自己的自定义 IWaveProvider/WaveStream 来完成此操作,其输出 WaveFormat 具有三个 channel 。它包含对三个输入文件中每一个的引用。然后,在 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 的输入。

关于.net - 如何在 C# 中使用 NAudio 将 3 个 wav 文件加入到具有 3 个 channel 的单个文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962312/

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