在NAudio中设置播放开始/结束点

时间:2016-02-07 07:54:24

标签: c# .net audio timer naudio

有没有办法在NAudio中设置播放的起点和终点?目前我正在使用Timer定期检查ChannelPosition并在结束时将其重置为开始位置。有没有更好的方法?

1 个答案:

答案 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();