C# 使用NAudio在指定位置应用线性淡入度
我在我写的一个C#程序中使用了 我想在我正在处理的音频片段中的某个位置应用线性淡入 在NAudio示例项目中,有一个名为FadeInOutSampleProvider.cs()的文件,该文件具有C# 使用NAudio在指定位置应用线性淡入度,c#,audio,naudio,C#,Audio,Naudio,我在我写的一个C#程序中使用了 我想在我正在处理的音频片段中的某个位置应用线性淡入 在NAudio示例项目中,有一个名为FadeInOutSampleProvider.cs()的文件,该文件具有BeginFadeIn(double FadeDorationInMilses)和BeginFadeOut(double FadeDouble FadeDorationInMilses)方法 我已经修改了这些方法来 BeginFadeOut(以毫秒为单位的双衰减,以毫秒为单位的双衰减) 和 BeginFa
BeginFadeIn(double FadeDorationInMilses)
和BeginFadeOut(double FadeDouble FadeDorationInMilses)
方法
我已经修改了这些方法来
BeginFadeOut(以毫秒为单位的双衰减,以毫秒为单位的双衰减)
和
BeginFadeOut(以毫秒为单位的双衰减,以毫秒为单位的双衰减)
但是,我很难实现这些更改的间隔逻辑
我的第一个想法是在Read()
方法中引入代码。调用时,它将请求的字节数除以采样率,这将给出请求的音频秒数
然后我可以跟踪这一点,当读取了正确数量的自动数据时,允许应用淡入淡出
然而,在我的计算中,我没有得到我期望看到的数字。我相信有更好的方法来解决这个问题
非常感谢您的帮助。听起来您的工作方向是正确的。正如您所说,请求的音频量可以通过将请求的采样数除以采样率来计算。但你也必须考虑到渠道。在立体声文件中,每秒的采样数是采样率的两倍 我把一个非常基本的延迟淡出的代码示例放在一个。可以进行一些改进,例如允许通过调用
Read
返回的音频部分开始淡出,但这让您大致了解如何通过对FadeInOutSampleProvider进行一些小修改来实现淡出
主要更改是BeginFadeOut的一个额外参数,该参数设置了两个新变量(fadeOutDelaySamples、fadeOutDelayPosition):
/// <summary>
/// Requests that a fade-out begins (will start on the next call to Read)
/// </summary>
/// <param name="fadeDurationInMilliseconds">Duration of fade in milliseconds</param>
public void BeginFadeOut(double fadeAfterMilliseconds, double fadeDurationInMilliseconds)
{
lock (lockObject)
{
fadeSamplePosition = 0;
fadeSampleCount = (int)((fadeDurationInMilliseconds * source.WaveFormat.SampleRate) / 1000);
fadeOutDelaySamples = (int)((fadeAfterMilliseconds * source.WaveFormat.SampleRate) / 1000);
fadeOutDelayPosition = 0;
//fadeState = FadeState.FadingOut;
}
}
public int Read(float[] buffer, int offset, int count)
{
int sourceSamplesRead = source.Read(buffer, offset, count);
lock (lockObject)
{
if (fadeOutDelaySamples > 0)
{
fadeOutDelayPosition += sourceSamplesRead / WaveFormat.Channels;
if (fadeOutDelayPosition >= fadeOutDelaySamples)
{
fadeOutDelaySamples = 0;
fadeState = FadeState.FadingOut;
}
}
if (fadeState == FadeState.FadingIn)
{
FadeIn(buffer, offset, sourceSamplesRead);
}
else if (fadeState == FadeState.FadingOut)
{
FadeOut(buffer, offset, sourceSamplesRead);
}
else if (fadeState == FadeState.Silence)
{
ClearBuffer(buffer, offset, count);
}
}
return sourceSamplesRead;
}