Existe uma maneira em C # de reproduzir áudio (por exemplo, MP3) diretamente de um System.IO.Stream que, por exemplo, foi retornado de um WebRequest sem salvar os dados temporariamente no disco?
Solução com NAudio
Com a ajuda do NAudio 1.3 é possível:
- Carregue um arquivo MP3 de um URL em um MemoryStream
- Converta dados de MP3 em dados de onda depois de carregados completamente
- Reproduzir os dados de ondas usando NAudio classe WaveOut 's
Seria bom poder tocar até mesmo um arquivo MP3 carregado pela metade, mas isso parece impossível devido ao design da biblioteca do NAudio .
E esta é a função que fará o trabalho:
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);
}
}
}
}
}