Frage

Ich habe NAudio und seine WaveStream bezogenen Klassen, aber ich konnte ein in Art und Weise nicht gebaut finde einen WaveStream basierend auf PCM-Samples zu erstellen, dass ich zur Verfügung stellen.

Im Idealfall würde Ich mag so etwas tun:

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

Gibt es eine Möglichkeit, dies mit NAudio zu tun?

Bearbeiten nach Klärung von Hans, Mark (Danke für das Feedback):

ich einen Strom benötigt, dass ich SoundPlayer.Play passieren könnte, diese passen nicht gut mit WaveStream. In meinem Projekt endete ich die folgende Klasse Implementierung bis die Proben und eine WaveFormat nimmt und kann von dem SoundPlayer gespielt werden.

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();
    }
}
War es hilfreich?

Lösung

Nein, nichts Vergleichbares. Sie können jedoch eigene erstellen. Die Welle \ Wavestream \ wavefilereader.cs Quellcodedatei ist wahrscheinlich am besten, mit zu beginnen. Bunch von Sachen, die Sie von ihm abstreifen kann, ersetzen Sie die Wavestream durch einen korrekt initialisiert Memory.

Andere Tipps

Hier ist eine Klasse, die Sie in einem MemoryStream basierend auf Byte-Array übergeben werden können, wenn Sie wollen. Ich werde wahrscheinlich auch so etwas wie dies in NAudio 1.4 wie ich viele Support-Anfragen darüber, wie dies zu tun.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top