我希望在应用程序的整个生命周期中能够将声音文件异步地转储到音频输出。我需要能够请求一个文件被播放,并有它与任何已经在播放的文件混合。同一个文件可能会被多次调用。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 );发布于 2012-10-17 20:33:24
有几种方法可以做到这一点,但这里有一个选择。创建一个一直打开的播放器和混音器。我会使用MixingSampleProvider作为混合器,通过SampleToWaveProvider或SampleToWaveProvider16将其作为输入传递给播放器。
为了确保播放永远不会停止,您需要自定义MixingSampleProvider,使Read始终返回所要求的样本数,即使没有活动输入也是如此,或者添加一个虚拟输入,这是一个永无止境的静默流。
现在要播放一个声音,只需将一个ISampleProvider (例如AudioFileReader)传入混音器的AddMixerInput中,它就会播放它。当输入到达末尾时,它会自动删除输入。
另一种方法是为要播放的每个声音创建一个新的player对象。缺点是找出了一种方法,使播放器对象保持活动状态,直到播放停止(可能是通过将其存储在字典中,然后在PlaybackStopped事件触发时将其处理和取出)。这样做的好处是,当您不需要打开声音设备时,您可以轻松地以不同的采样率/通道数播放声音。
https://stackoverflow.com/questions/12927741
复制相似问题