c# - 使用 NAudio 在运行时更改波形格式

标签 c# naudio directsound

我已经使用以下方法初始化了设备:

static  IWavePlayer     waveOut;
static  WaveFormat      waveFormat;
static  BufferedWaveProvider    waveProvider;

private static int AudioDeviceInit()
{
            waveOut = new DirectSoundOut();
            waveFormat = new WaveFormat(44100, 2);
            waveProvider = new BufferedWaveProvider(waveFormat);

            waveOut.Init(waveProvider);
            waveOut.Play();

            return 0;
}

我正在使用以下方法向它添加 pcm 流:

waveProvider.AddSamples(samples, 0, size);

只要流数据具有相同的配置,上面的方法就可以正常工作。

我有另一个接收采样率和 channel 数的函数,我想重新配置 waveprovider 以使用新提供的配置。这是我正在使用的代码:

private static void AudioConfigCallback(int rate, int channel)
{
    waveFormat = new WaveFormat(rate, channel);
    waveProvider = new BufferedWaveProvider(waveFormat);
    waveOut.Init(waveProvider);
    return;
}

这是行不通的,我认为这也不是正确的做法。知道如何重新配置​​设备以使用新的 sample_rate 和 num_channels

谢谢。

最佳答案

这是不可能的。当您打开输出设备时,无论是 WaveOut、Direct Sound、WASAPI 还是 ASIO,此时您必须指定您将使用的格式。您必须关闭输出设备并使用新的 WaveFormat 重新打开它。

另一种方法是始终转换为固定的 WaveFormat,并在传入格式发生变化时使用 WaveFormatConversionStream 转换为正确的格式。这将允许您避免打开和关闭输出设备。

关于c# - 使用 NAudio 在运行时更改波形格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6774353/

相关文章:

wpf - NAudio修剪mp3文件

audio - NAudio-一起使用WaveIn和AudioEndpointVolume

windows - IDirectSound8::CreateSoundBuffer返回DSERR_BUFFERLOST

audio - 原始声音播放

c# - 从多个源接收音频数据并将它们合并到波形文件中

c# - 在 Linux 64 位上按值将结构传递给 P/Invoked 库?

c# - Selenium WebDriver - 如何使用 C# 设置页面加载超时

c# - 使用 Type 变量转换对象

c# - Visual Studio 找不到新项目的任何引用

c# - 将 PCM 转换为 MP3/OGG