Erstellen eines Wavestream von PCM-Samples
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();
}
}
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);
}
}