无法使用FadeInOutSampleProvider淡出

时间:2014-06-11 07:51:54

标签: naudio

我正在尝试使用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中没有类似的东西。这很简单,所以我在这里省略了来源。

1 个答案:

答案 0 :(得分:1)

问题是您尝试在图表中重复使用sampleSource两次。因此,在sampleSource读取任何内容之前,fadeOutSource已被读到最后。可能适合您的使用,FadeInOutSampleProvider最好能够安排"在已知数量的样本之后淡出。

另一种方法是FadeOutSampleProvider缓存淡出持续时间,然后当它检测到其源的结束时,它返回淡出的缓存部分。它确实意味着延迟被引入。