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

C# 如何将2个wav文件混合在一起?,c#,audio,naudio,C#,Audio,Naudio,我正在尝试录制一个输入,并将其与一首歌曲合并在一起(而不是合并)。我有一把吉他,是我在听一首歌的时候录制的,我想把吉他放在这首歌上(比如audcaity)。 有办法吗?如果它不可能在实时混合-有可能合并他们后,我记录?比如在我录制吉他之后,现在它是一个wav文件,我想把两个wav文件混合在一起。 这就是输入设备: private void Capture() { input = new WasapiCapture((MMDevice)inputCombo.Selecte

我正在尝试录制一个输入,并将其与一首歌曲合并在一起(而不是合并)。我有一把吉他,是我在听一首歌的时候录制的,我想把吉他放在这首歌上(比如audcaity)。 有办法吗?如果它不可能在实时混合-有可能合并他们后,我记录?比如在我录制吉他之后,现在它是一个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可能吗?

使用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));

使用
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));

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

这里的
信号发生器
有一个
增益
属性,可以指定混音中的音量

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);
        }
    }
}

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

这里的
信号发生器
有一个
增益
属性,可以指定混音中的音量

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);
        }
    }
}