C'è un modo in C # per riprodurre l'audio (ad esempio, MP3) direttamente da un System.IO.Stream che ad esempio è stato ritrasmesso da un WebRequest senza salvare temporaneamente i dati sul disco?
Soluzione con NAudio
Con l'aiuto di NAudio 1.3 è possibile:
- Carica un file MP3 da un URL in un MemoryStream
- Converti i dati MP3 in dati wave dopo che è stato completamente caricato
- Riprodurre i dati d'onda utilizzando NAudio s' class WaveOut
Sarebbe stato bello poter riprodurre anche un file MP3 caricato a metà, ma questo sembra essere impossibile a causa del design della libreria NAudio .
E questa è la funzione che farà il lavoro:
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);
}
}
}
}
}