有没有办法在NAudio中设置播放的起点和终点?目前我正在使用Timer
定期检查ChannelPosition
并在结束时将其重置为开始位置。有没有更好的方法?
答案 0 :(得分:0)
如果您实施自己的IWaveProvider
包裹WaveStream
,则可以在流上设置CurrentTime
并检查Read
实施是否已通过结束时间。通过将基础流上的时间设置回到开始时间,您可以在两个时间戳之间进行声音回放循环。
该类的实现如下所示:
private class StartEndLoopReader:IWaveProvider
{
private TimeSpan _start;
private TimeSpan _end;
private WaveStream _stream;
public StartEndLoopReader(WaveStream stream, TimeSpan start, TimeSpan end)
{
_stream = stream;
_stream.CurrentTime = start;
_start = start;
_end = end;
}
public int Read(byte[] array, int offset, int count)
{
Debug.WriteLine(_stream.CurrentTime);
if (_stream.CurrentTime>_end)
{
// back to start to loop
// if you want to stop here, return 0 instead.
_stream.CurrentTime = _start;
}
return _stream.Read(array, offset, count);
}
#region IWaveProvider Members
public WaveFormat WaveFormat
{
get { return _stream.WaveFormat; }
}
#endregion
}
您可以按如下方式使用此课程:
var wo = new NAudio.Wave.WaveOutEvent();
var reader = new StartEndLoopReader(
new WaveFileReader( @"v1.wav"),
new TimeSpan(0,0,2),
new TimeSpan(0,0,4));
wo.Init(reader);
wo.Play();