在 NAudio 中设置播放 start/end 点
Setting playback start/end points in NAudio
有没有办法在NAudio中设置播放的起点和终点?目前我正在使用 Timer
定期检查 ChannelPosition
并在到达终点时将其重置为起始位置。有没有更好的方法?
如果您实现自己的 IWaveProvider
来包装 WaveStream
,您可以在您的流中设置 CurrentTime
并在通过时签入 Read
实现结束时间。通过将基础流上的时间设置回开始时间,您可以让您的声音片段在两个时间戳之间循环。
class 的实现如下所示:
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
}
您可以按如下方式使用此 class:
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();
有没有办法在NAudio中设置播放的起点和终点?目前我正在使用 Timer
定期检查 ChannelPosition
并在到达终点时将其重置为起始位置。有没有更好的方法?
如果您实现自己的 IWaveProvider
来包装 WaveStream
,您可以在您的流中设置 CurrentTime
并在通过时签入 Read
实现结束时间。通过将基础流上的时间设置回开始时间,您可以让您的声音片段在两个时间戳之间循环。
class 的实现如下所示:
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
}
您可以按如下方式使用此 class:
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();