使用MixingWaveProvider32实现NAudio多轨播放器的快进回退问题
NAudio多轨播放器快进时MmException的解决方向
直接修改AudioFileReader.CurrentTime触发MmException的核心原因是:音频输出设备处于活跃播放状态时,MixingWaveProvider32正在实时从各轨读取数据,此时修改输入源的位置会导致设备缓冲区状态冲突。以下是具体解决步骤:
先暂停/停止音频输出设备
在调整任何轨的时间前,必须暂停(或停止)WaveOutEvent/WasapiOut等输出设备,确保MixingWaveProvider32不再从输入源读取数据:// waveOut为你的输出设备实例 waveOut.Pause();同步所有轨的CurrentTime
遍历所有AudioFileReader实例,统一设置目标时间,保证多轨严格同步:var targetTime = TimeSpan.FromSeconds(30); // 目标快进时间 foreach (var reader in trackReaders) // trackReaders是你的AudioFileReader集合 { // 避免目标时间超出文件总时长导致越界 if (targetTime < reader.TotalTime) { reader.CurrentTime = targetTime; } }恢复播放
所有轨时间调整完成后,重新启动播放:waveOut.Play();
额外注意事项:
- 若轨经过SampleProvider等中间处理(如音量调节、均衡器),请直接修改底层
AudioFileReader的CurrentTime,多数上层SampleProvider不支持直接设置位置。 - 若用
Stop()替代Pause(),后续Play()会重新初始化设备,虽有短暂延迟,但状态更稳定。 - 查看
MmException的具体错误码(如MmsysErr.InvalidParam),可定位细节问题,比如某轨时间设置超出有效范围。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

