Pergunta

Eu verifiquei Naudio e seu WaveStream classes relacionadas, mas não consegui encontrar uma maneira integrada para criar um WaveStream com base em amostras de PCM que eu forneço.

Idealmente, eu gostaria de fazer algo assim:

byte[] samples = ...
WaveFormat waveFormat = new WaveFormat(audioSampleRate, 
                                       audioBitsPerSample,
                                       audioChannels);
WaveStream waveStream = CreateWaveStreamfromSamples(waveFormat,
                                                    samples);

Existe uma maneira de fazer isso usando Naudio?

Editar Após esclarecimentos de Hans, Mark (obrigado pelo feedback):

Eu precisava de um fluxo que eu pudesse passar SoundPlayer.Play, isso não se encaixa bem com WaveStream. No meu projeto, acabei implementando a aula a seguir, que leva amostras e um WaveFormat e pode ser reproduzido por SoundPlayer.

public class MemoryWaveStream : Stream
{
    public override bool CanSeek { get { return false; } }
    public override bool CanWrite { get { return false; } }
    public override bool CanRead { get { return true; } }
    public override long Length { get { return _waveStream.Length; } }
    public override long Position { get { return _waveStream.Position; } set { _waveStream.Position = value; } }

    private MemoryStream _waveStream;

    public MemoryWaveStream(byte[] sampleData, WaveFormat waveFormat)
    {
        _waveStream = new MemoryStream();
        BinaryWriter bw = new BinaryWriter(_waveStream);
        bw.Write(new char[4] { 'R', 'I', 'F', 'F' });

        int length = 36 + sampleData.Length;
        bw.Write(length);

        bw.Write(new char[8] { 'W', 'A', 'V', 'E', 'f', 'm', 't', ' ' });

        waveFormat.Serialize(bw);
        bw.Write(new char[4] { 'd', 'a', 't', 'a' });
        bw.Write(sampleData.Length);
        bw.Write(sampleData, 0, sampleData.Length);
        _waveStream.Position = 0;
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return _waveStream.Read(buffer, offset, count);
    }

    public override void Flush()
    {
        _waveStream.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return _waveStream.Seek(offset, origin);
    }

    public override void SetLength(long value)
    {
        throw new NotImplementedException();
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        throw new NotImplementedException();
    }
}
Foi útil?

Solução

Não, nada parecido. No entanto, você pode criar o seu próprio. A onda WaveStream WaveFileReader.cs O arquivo de código -fonte é provavelmente melhor para começar. Bunco de coisas que você pode tirar, substitua a transmissão de onda por um MemoryStream de maneira adequada.

Outras dicas

Aqui está uma aula que você pode passar um MemoryStream Com base na sua matriz de bytes, se você quiser. Provavelmente incluirei algo assim no Naudio 1.4, pois recebo muitas solicitações de suporte sobre como fazer isso.

public class RawSourceWaveStream : WaveStream
{
    private Stream sourceStream;
    private WaveFormat waveFormat;

    public RawSourceWaveStream(Stream sourceStream, WaveFormat waveFormat)
    {
        this.sourceStream = sourceStream;
        this.waveFormat = waveFormat;
    }

    public override WaveFormat WaveFormat
    {
        get { return this.waveFormat; }
    }

    public override long Length
    {
        get { return this.sourceStream.Length; }
    }

    public override long Position
    {
        get
        {
            return this.sourceStream.Position;
        }
        set
        {
            this.sourceStream.Position = value;
        }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return sourceStream.Read(buffer, offset, count);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top