在 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();