Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NAudio在指定位置应用线性淡入度_C#_Audio_Naudio - Fatal编程技术网

C# 使用NAudio在指定位置应用线性淡入度

C# 使用NAudio在指定位置应用线性淡入度,c#,audio,naudio,C#,Audio,Naudio,我在我写的一个C#程序中使用了 我想在我正在处理的音频片段中的某个位置应用线性淡入 在NAudio示例项目中,有一个名为FadeInOutSampleProvider.cs()的文件,该文件具有BeginFadeIn(double FadeDorationInMilses)和BeginFadeOut(double FadeDouble FadeDorationInMilses)方法 我已经修改了这些方法来 BeginFadeOut(以毫秒为单位的双衰减,以毫秒为单位的双衰减) 和 BeginFa

我在我写的一个C#程序中使用了

我想在我正在处理的音频片段中的某个位置应用线性淡入

在NAudio示例项目中,有一个名为FadeInOutSampleProvider.cs()的文件,该文件具有
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;
}