gpt4 book ai didi

c# - 使用NAudio在指定位置应用线性淡入淡出

转载 作者:行者123 更新时间:2023-12-02 23:12:02 26 4
gpt4 key购买 nike

我在编写的C#程序中使用NAudio

我想在我正在使用的一段音频中的某个位置处应用线性淡入淡出。

在NAudio示例项目中,有一个名为FadeInOutSampleProvider.cs(Cached example)的文件,该文件具有BeginFadeIn(double fadeDurationInMilliseconds)BeginFadeOut(double fadeDurationInMilliseconds)方法。

我重新设计了这些方法BeginFadeOut(double fadeDurationInMilliseconds, double beginFadeAtMilliseconds)BeginFadeOut(double fadeDurationInMilliseconds, double beginFadeAtMilliseconds)
但是,我很难为这些更改实现间隔逻辑。

我的第一个想法是在Read()方法中引入代码。当被调用时,它将请求的字节数除以采样率,从而得出请求的音频秒数。

然后,我可以跟踪此情况,并在读取了正确数量的自动数据后,允许应用淡入淡出。

但是,我没有得到期望的数字。我敢肯定,有更好的方法来解决这个问题。

任何帮助将不胜感激。

最佳答案

听起来您正在按照正确的方向工作。正如您所说,可以通过将请求的样本数除以采样率来计算请求的音频量。但是,您还必须考虑 channel 。在立体声文件中,每秒的采样数是采样率的两倍。

我在GitHub gist here中放置了一个非常基本的延迟淡出的代码示例。可以进行一些改进,例如允许淡入淡出从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;
}
}

然后,在 Read方法中,我们可以跟踪延迟有多远,如果有,我们可以开始淡出
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;
}

关于c# - 使用NAudio在指定位置应用线性淡入淡出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com