5

我正在使用 NAudio 库来编写一个简单的 WinForms 录音机/播放器。我的问题是如何判断播放已完成?之后我需要关闭波流。

我知道下面列出了一个 PlaybackStopped 事件:

wfr = new NAudio.Wave.WaveFileReader(this.outputFilename);
audioOutput = new DirectSoundOut();
WaveChannel32 wc = new NAudio.Wave.WaveChannel32(wfr); 
audioOutput.Init(wc);
audioOutput.PlaybackStopped += new EventHandler<StoppedEventArgs>(audioOutput_PlaybackStopped);
audioOutput.Play();

但是这个 PlaybackStopped 事件似乎只能通过调用来触发audioOutput.stop(),有谁知道如何确定播放是否完成?

我为这个问题创建了一个开源项目,你可以在这里找到它:https ://code.google.com/p/stack-overflow-questions/

4

2 回答 2

9

PlaybackStopped当您手动停止播放或IWaveProvider您正在使用的 Read 方法返回 0时会引发该事件。这里的问题是WaveChannel32当源流结束时不会停止返回数据,因此播放永远不会结束。该PadWithZeroes属性应设置为 false 以解决此问题。

于 2012-07-01T07:52:13.803 回答
1

正如@Mark Heath另外描述的那样,我想添加Naudio的编码示例,它将在Debug/Sound Folder文件夹中播放一个mp3文件并等到它没有完成。播放完成可以通过以下方式检查waveOut.PlaybackState == PlaybackState.Stopped

play_string = @"SOUND/space.mp3";
var reader = new Mp3FileReader(play_string);
var waveOut = new WaveOut(); // or WaveOutEvent()
waveOut.Init(reader);
waveOut.Play();
while (waveOut.PlaybackState != PlaybackState.Stopped) ; // Wait untill the playing isn't finished. 
于 2020-05-09T11:44:59.137 回答