【问题标题】:Changing wave format at runtime with NAudio使用 NAudio 在运行时更改波形格式
【发布时间】:2011-10-10 02:26:48
【问题描述】:

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

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);

只要流数据具有相同的配置,上述工作正常。

我有另一个接收采样率和通道数的函数,我想重新配置 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

谢谢。

【问题讨论】:

    标签: c# naudio directsound


    【解决方案1】:

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

    另一种方法是始终转换为固定的 WaveFormat,并在传入格式发生更改时使用 WaveFormatConversionStream 转换为正确的格式。这样可以避免打开和关闭输出设备。

    【讨论】:

    • 谢谢马克。在性能方面,关闭/打开设备或格式转换哪个更好?
    • 关闭/打开设备会更好,因为任何必要的 SRC 都将由驱动程序本身完成(至少使用 WaveOut/DirectSoundOut)。
    • 是的,我也是这么想的。再次关闭并打开设备后,它现在可以工作了。非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多