我肯定错过了NAudio的基本原则。我试图播放两次相同的声音而不能。发生了什么事?
var path = @"\Rim Shot 2.wav";
var path2 = @"\Rim Shot 4.wav";
var mStream1 = new MemoryStream(File.ReadAllBytes(path));
var mStream2 = new MemoryStream(File.ReadAllBytes(path2));
var stream1 = (new WaveFileReader(mStream1)).ToStandardWaveStream();
var stream2 = (new WaveFileReader(mStream2)).ToStandardWaveStream();
stream1.WaveFormat.Dump();
stream2.WaveFormat.Dump();
var channel1 = new SampleChannel(stream1);
var channel2 = new SampleChannel(stream2);
var format = stream1.WaveFormat;
format = WaveFormat.CreateIeeeFloatWaveFormat(format.SampleRate, format.Channels);
var mixer = new MixingSampleProvider(format);
mixer.ReadFully = true;
try
{
output.Init(mixer);
output.Play();
mixer.AddMixerInput(channel1);
Task.Delay(10).Wait();
mixer.AddMixerInput(channel2);
Task.Delay(10).Wait();
mixer.AddMixerInput(channel1);
Task.Delay(2000).Wait();
}
catch(Exception ex)
{
ex.Dump();
}
finally
{
if(mStream1 != null) mStream1.Dispose();
if(mStream2 != null) mStream2.Dispose();
if(stream1 != null) stream1.Dispose();
if(stream2 != null) stream2.Dispose();
}
其中ToStandardWaveStream()
是我的扩展方法:
public static WaveStream ToStandardWaveStream(this WaveStream stream)
{
if(stream == null) throw new ArgumentNullException("The expected Wave Stream is not here.");
var encoding = stream.WaveFormat.Encoding;
var isNotPcmFormat = (encoding != WaveFormatEncoding.Pcm);
var isNotIeeeFloatFormat = (encoding != WaveFormatEncoding.IeeeFloat);
Func<WaveStream> convert = () =>
{
stream = WaveFormatConversionStream.CreatePcmStream(stream);
stream = new BlockAlignReductionStream(stream);
return stream;
};
return (isNotPcmFormat && isNotIeeeFloatFormat) ? convert() : stream;
}
答案 0 :(得分:1)
您无法将相同的流作为输入添加到调音台两次。您需要创建第二个全新的流读取来自相同的WAV文件才能添加。第二个流将在开头。为了提高效率,我需要在鼓机中缓存声音数据(正如您所做),但您仍然需要创建新的WaveFileReaders(或RawSourceStreams),因此它们从头开始
有关此操作的示例,请查看WPF Drum machine demo的NAudio源代码。