我正在尝试使用NAudio的FadeInOutSampleProvider
淡出示例并淡出它。淡入效果还可以,但是逐渐消失,而不是逐渐消失,我会从淡出应该开始的地方突然沉默。
使用FadeInOutSampleProvider
淡出的正确方法是什么?
以下是我尝试这样做的方法:
IWaveProvider waveSource; // initialised by reading a WAV file
// The ISampleProvider will be the underlying source for the following operations
ISampleProvider sampleSource = waveSource.ToSampleProvider();
// Create a provider which defines the samples we want to fade in
// (including the full-volume "middle" of the final output)
ISampleProvider fadeInSource = new OffsetSampleProvider(sampleSource);
fadeInSource.TakeSamples = most_of_file; // calculation omitted for brevity
// Create a provider which defines the samples we want to fade out:
// We will play these samples when fadeInSource is finished
ISampleProvider fadeOutSource = new OffsetSampleProvider(sampleSource);
fadeOutSource.SkipOverSamples = fadeInSource.TakeSamples;
// Wrap the truncated sources in FadeInOutSampleProviders
var fadeIn = new FadeInOutSampleProvider(fadeInSource);
fadeIn.BeginFadeIn(500); // half-second fade
var fadeOut = new FadeInOutSampleProvider(fadeOutSource);
fadeOut.BeginFadeOut(500);
// doc-comments suggest the fade-out will begin "after first Read"
我期望fadeOut
最初在原始源结束前500毫秒读取非零样本,但在源结束时淡出为零。
但是,当我播放fadeIn
完成,然后播放fadeOut
时,我发现第一次 Read
调用fadeOut
填充带零的缓冲区。
我做错了吗?或者NAudio中有错误吗?
注意:我正在使用我自己实现的ConcatenatingSampleProvider
处理顺序播放 - 我在NAudio的API中没有类似的东西。这很简单,所以我在这里省略了来源。
答案 0 :(得分:1)
问题是您尝试在图表中重复使用sampleSource
两次。因此,在sampleSource
读取任何内容之前,fadeOutSource
已被读到最后。可能适合您的使用,FadeInOutSampleProvider
最好能够安排"在已知数量的样本之后淡出。
另一种方法是FadeOutSampleProvider
缓存淡出持续时间,然后当它检测到其源的结束时,它返回淡出的缓存部分。它确实意味着延迟被引入。