如何将 2 个 wav 文件混合在一起?
How to Mix 2 wav files together?
我正在尝试录制输入并将其与歌曲合并(不是串联)。我有一把吉他,是我在听歌时录制的,我想把吉他放在歌曲中(比如 audcaity)。
有什么办法吗?如果实时混音不可能——我录制后是否可以合并它们?就像在我录制吉他之后,现在它是一个 wav 文件,我想将 2 个 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:\....wav");
var wav2 = new WaveFileReader(@"c:\....wav");
mixer.AddInputStream(new WaveChannel32(wav1));
mixer.AddInputStream(new WaveChannel32(wav2));
WaveFileWriter.CreateWaveFile("mixed.wav", new Wave32To16Stream(mixer));
要使用 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);
}
}
}
我正在尝试录制输入并将其与歌曲合并(不是串联)。我有一把吉他,是我在听歌时录制的,我想把吉他放在歌曲中(比如 audcaity)。 有什么办法吗?如果实时混音不可能——我录制后是否可以合并它们?就像在我录制吉他之后,现在它是一个 wav 文件,我想将 2 个 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:\....wav");
var wav2 = new WaveFileReader(@"c:\....wav");
mixer.AddInputStream(new WaveChannel32(wav1));
mixer.AddInputStream(new WaveChannel32(wav2));
WaveFileWriter.CreateWaveFile("mixed.wav", new Wave32To16Stream(mixer));
要使用 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);
}
}
}