2

NAudio 有什么方法可以将 WaveMixerStream32 与 WaveProviders 链接,而不是 WaveStreams?我正在使用 BufferedWaveProvider 流式传输多个网络流。似乎没有一种简单的方法可以将其转换为 WaveStream。

干杯!

卢克

4

1 回答 1

6

将 IWaveProvider 转换为 WaveStream 相当简单。IWaveProvider 只是一个简化的 WaveStream,不支持重新定位并且长度未知。您可以像这样创建适配器:

public class WaveProviderToWaveStream : WaveStream
{
    private readonly IWaveProvider source;
    private long position;

    public WaveProviderToWaveStream(IWaveProvider source)
    {
        this.source = source;
    }

    public override WaveFormat WaveFormat
    {
        get { return source.WaveFormat;  }
    }

    /// <summary>
    /// Don't know the real length of the source, just return a big number
    /// </summary>
    public override long Length
    {
        get { return Int32.MaxValue; } 
    }

    public override long Position
    {
        get
        {
            // we'll just return the number of bytes read so far
            return position;
        }
        set
        {
            // can't set position on the source
            // n.b. could alternatively ignore this
            throw new NotImplementedException();
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int read = source.Read(buffer, offset, count);
        position += read;
        return read;
    }
}

我已经对 Length 和 Position 属性发表了一些评论。您需要对它们做什么取决于您将其传递给的类是否尝试使用这些属性。

此外,没有什么可以阻止您创建自己的适用于 IWaveProvider 的 WaveMixerStream32 版本。您可以简化很多事情,因为由于您无法重新定位任何输入,因此无需在混音器中实现任何重新定位逻辑。

于 2011-07-09T19:39:19.627 回答