¿Hay alguna forma en C # de reproducir audio (por ejemplo, MP3) directamente desde un System.IO.Stream que, por ejemplo, fue recuperado de un WebRequest sin guardar los datos temporalmente en el disco?
Solución con NAudio
Con la ayuda de NAudio 1.3 es posible:
- Cargue un archivo MP3 desde una URL en un MemoryStream
- Convierta datos MP3 en datos de ondas después de que se hayan cargado por completo
- La reproducción de los datos de onda utilizando NAudio clase WaveOut 's
Hubiera sido bueno poder incluso reproducir un archivo MP3 medio cargado, pero esto parece imposible debido al diseño de la biblioteca NAudio .
Y esta es la función que hará el trabajo:
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);
}
}
}
}
}