NAudio 异步音频

Posted

技术标签:

【中文标题】NAudio 异步音频【英文标题】:NAudio asynchronous audio 【发布时间】:2012-10-17 05:36:02 【问题描述】:

我希望能够在应用程序的整个生命周期内将声音文件异步转储到音频输出。我需要能够请求要播放的文件并将其与任何已经播放的文件混合。同一个文件可能会被调用多次。 WaveMixerStream 是要走的路吗? 在应用程序的整个生命周期内保持播放器和混音器流打开是否安全/建议是否安全,否则会导致性能问题?

//globals
IWavePlayer _Context;
WaveMixerStream32 _Mixer;

//constructor
_Context = new DirectSoundOut();
_Mixer = new WaveMixerStream32();
_Context.Init( Instance._Mixer );
_Context.Play();

//asynchronous sound output, on demand from user interface
_Mixer.AddInputStream( sound.FileWaveStream );

【问题讨论】:

【参考方案1】:

有几种方法可以做到这一点,但这里有一种选择。创建一个始终打开的播放器和混音器。我会使用 MixingSampleProvider 作为混音器,通过 SampleToWaveProvider 或 SampleToWaveProvider16 作为播放器的输入。

为确保播放永不停止,您需要自定义 MixingSampleProvider 以便 Read 始终返回请求的样本数,即使没有活动输入,也可以添加一个虚拟输入,它是一个永无止境的静音流。

现在要播放声音,只需将 ISampleProvider(例如 AudioFileReader)传递到混音器的 AddMixerInput,它就会播放它。它会在输入到达末尾时自动删除它们。

另一种方法是为每个要播放的声音创建一个新的播放器对象。缺点是想办法让播放器对象保持活动状态直到播放停止(可能通过存储在字典中,然后在 PlaybackStopped 事件触发时将其释放并取出)。优点是您无需在不需要时保持声音设备打开,并且您可以轻松地以不同的采样率/通道数播放声音。

【讨论】:

以上是关于NAudio 异步音频的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 替换视频的音频流

使用 naudio 录制特定的应用程序音频

来自流的NAudio?播放音频

是否可以在 C# 中使用 NAudio 创建新的音频输入?

NAudio - 通过终端服务器连接播放断断续续的音频

使用 NAudio 获取音频的峰值