【发布时间】:2010-09-16 03:04:51
【问题描述】:
在 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);
}
}
}
}
}
【问题讨论】:
-
很高兴看到你成功了。在流式传输时正确播放它不会有太多工作。主要问题是 Mp3FileReader 目前希望提前知道长度。我会考虑为下一个版本的 NAudio 添加一个演示
-
@Mark Heath 您是否已经解决了问题并在当前 NAudio 版本中添加了演示,还是仍在您的管道中?
-
恐怕还没有,尽管在 NAudio 1.3 中进行了更改,它不需要太多调整即可使其正常工作。
-
马克:我是否需要在 NAudio 中进行修改才能使其正常工作,因为我刚刚下载了 NAudio1.3,但它接受了上面的代码而不做任何更改,但另一方面抛出了类似于“无法进行 ACM 转换”。
标签: .net audio stream mp3 naudio