C# 中有没有办法直接从System.IO.Stream播放音频(例如 MP3),例如从 WebRequest 返回而不将数据临时保存到磁盘?
NAudio解决方案
在NAudio 1.3的帮助下,可以:
- 将 MP3 文件从 URL 加载到 MemoryStream
- 完全加载后将 MP3 数据转换为波形数据
- 使用NAudio的 WaveOut 类播放波形数据
能够播放半加载的 MP3 文件本来会很好,但由于NAudio库的设计,这似乎是不可能的。
这是将完成工作的功能:
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);
}
}
}
}
}