Erstellen einer WaveStream von PCM-samples
Habe ich überprüft NAudio und seine WaveStream
Verwandte Klassen, aber ich konnte nicht finden eine eingebaute Möglichkeit zum erstellen einer WaveStream
basierend auf PCM-samples, die ich stellen.
Idealerweise würde ich gerne etwas wie das hier tun:
byte[] samples = ...
WaveFormat waveFormat = new WaveFormat(audioSampleRate,
audioBitsPerSample,
audioChannels);
WaveStream waveStream = CreateWaveStreamfromSamples(waveFormat,
samples);
Gibt es eine Möglichkeit, dies zu tun mit NAudio?
Bearbeiten nach Klärung von Hans, Markus (vielen Dank für das feedback):
Brauchte ich einen stream, ich könnte pass zu SoundPlayer.Play
, das passt nicht gut mit WaveStream
. In meinem Projekt ich landete implementieren Sie die folgende Klasse, die nimmt Proben und eine WaveFormat
und können abgespielt werden, indem 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();
}
}
- Vielen Dank für die Bereitstellung der benutzerdefinierten Klasse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, nichts dergleichen. Sie können jedoch auch Ihre eigenen erstellen. Die Welle\wavestream\wavefilereader.cs source-code-Datei ist wahrscheinlich am besten für den Einstieg. Reihe von Sachen, die Sie können Streifen aus, ersetzen Sie den waveStream durch einen ordnungsgemäß initialisiert MemoryStream.
WaveFormat
verwendet wird, durch dieWaveFileWriter
beim schreiben in eine WAV-Datei.Hier ist eine Klasse, können Sie ein
MemoryStream
basierend auf Ihrem byte-array in, wenn Sie wollen. Ich werde wahrscheinlich so etwas wie dies in NAudio 1.4, wie ich bekommen eine Menge von support-Anfragen über, wie dies zu tun.