如何将2个wav文件混合在一起?

我正在尝试录制输入并将其与歌曲合并(不连接)。 我有一把吉他,我在听一首歌的同时录制了这首吉他,我想把吉他放在歌曲上(如音响)。 这样做有什么办法吗? 如果实时混音不可能 – 我可以在录制后将它们合并吗? 就像我录制了吉他,现在它是一个wav文件,我想把两个wav文件混合在一起。 多数输入设备:

private void Capture() { input = new WasapiCapture((MMDevice)inputCombo.SelectedItem); bufferedWaveProvider = new BufferedWaveProvider(input.WaveFormat); input.DataAvailable += WaveInOnDataAvailable; input.StartRecording(); write = new WaveFileWriter(System.IO.Path.GetTempFileName(), input.WaveFormat); } private void WaveInOnDataAvailable(object sender, WaveInEventArgs e) { bufferedWaveProvider.AddSamples(e.Buffer, 0, e.BytesRecorded); write.Write(e.Buffer, 0, e.BytesRecorded); write.Flush(); } 

我想将它写入已存在的wav文件而不是覆盖它,而不是将其写入空白文件。 是否可以使用MixingSampleProvider?

要使用MixingSampleProvider混合多个ISampleProvider源,您可以执行以下操作:

SignalGenerator具有Gain属性,可以指定混音中应该有多大声。

 using System; using NAudio.Wave; using NAudio.Wave.SampleProviders; namespace ConsoleApplication1 { internal class Program { private static void Main(string[] args) { ISampleProvider provider1 = new SignalGenerator { Frequency = 1000.0f, Gain = 0.5f }; ISampleProvider provider2 = new SignalGenerator { Frequency = 1250.0f, Gain = 0.5f }; var takeDuration1 = TimeSpan.FromSeconds(5); // otherwise it would emit indefinitely var takeDuration2 = TimeSpan.FromSeconds(10); var sources = new[] { provider1.Take(takeDuration1), provider2.Take(takeDuration2) }; var mixingSampleProvider = new MixingSampleProvider(sources); var waveProvider = mixingSampleProvider.ToWaveProvider(); WaveFileWriter.CreateWaveFile("test.wav", waveProvider); } } } 

这应该可以使用WaveMixerStream32 ,例如像这样

 var mixer = new WaveMixerStream32 { AutoStop = true}; var wav1 = new WaveFileReader(@"c:\...\1.wav"); var wav2 = new WaveFileReader(@"c:\...\2.wav"); mixer.AddInputStream(new WaveChannel32(wav1)); mixer.AddInputStream(new WaveChannel32(wav2)); WaveFileWriter.CreateWaveFile("mixed.wav", new Wave32To16Stream(mixer));