Existe-t-il un moyen en C # de lire de l'audio (par exemple, MP3) directement à partir d'un System.IO.Stream qui, par exemple, a été renvoyé à partir d'un WebRequest sans enregistrer temporairement les données sur le disque?
Solution avec NAudio
Avec l'aide de NAudio 1.3, il est possible de:
- Charger un fichier MP3 depuis une URL dans un MemoryStream
- Convertissez les données MP3 en données wave après leur chargement complet
- La lecture des données d'onde en utilisant NAudio classe WaveOut s »
Cela aurait été bien de pouvoir même lire un fichier MP3 à moitié chargé, mais cela semble impossible en raison de la conception de la bibliothèque NAudio .
Et c'est la fonction qui fera le travail:
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);
}
}
}
}
}