Gibt es in C # eine Möglichkeit, Audio (z. B. MP3) direkt von einem System.IO.Stream abzuspielen , das beispielsweise von einer WebRequest zurückgegeben wurde, ohne die Daten vorübergehend auf der Festplatte zu speichern?
Lösung mit NAudio
Mit Hilfe von NAudio 1.3 ist Folgendes möglich:
- Laden Sie eine MP3-Datei von einer URL in einen MemoryStream
- Konvertieren Sie MP3-Daten nach dem vollständigen Laden in Wave-Daten
- Spielen Sie die Wellendaten mit der WaveOut -Klasse von NAudio ab
Es wäre schön gewesen, sogar eine halb geladene MP3-Datei abspielen zu können, aber dies scheint aufgrund des NAudio- Bibliotheksdesigns unmöglich zu sein .
Und dies ist die Funktion, die die Arbeit erledigt:
public static void PlayMp3FromUrl(string url)
{
using (Stream ms = new MemoryStream())
{
using (Stream stream = WebRequest.Create(url)
.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[32768];
int read;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
ms.Position = 0;
using (WaveStream blockAlignedStream =
new BlockAlignReductionStream(
WaveFormatConversionStream.CreatePcmStream(
new Mp3FileReader(ms))))
{
using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
waveOut.Init(blockAlignedStream);
waveOut.Play();
while (waveOut.PlaybackState == PlaybackState.Playing )
{
System.Threading.Thread.Sleep(100);
}
}
}
}
}