C# 如何在Silverlight中将mp3流转换为wav流

C# 如何在Silverlight中将mp3流转换为wav流,c#,.net,silverlight,mp3,wav,C#,.net,Silverlight,Mp3,Wav,最近我一直在研究如何在silverlight应用程序中播放音乐,这就是我现在面临的情况: 1我可以使用MediaElement,但它一次只能播放一个音乐文件,因为我无法在项目中使用usercontrols,这可能不是解决方案 2我可以使用,但它只支持wav文件,即使是中等质量的文件也是相当大的 因为我想同时播放多个音乐文件并控制是否循环播放,所以我认为后一个可能是我的解决方案 我没有把音乐文件放在我的项目中,所以加载功能对我来说不起作用,相反,我把它们放在数据库中,在我得到所有字节后,我就可以播

最近我一直在研究如何在silverlight应用程序中播放音乐,这就是我现在面临的情况:

1我可以使用MediaElement,但它一次只能播放一个音乐文件,因为我无法在项目中使用usercontrols,这可能不是解决方案

2我可以使用,但它只支持wav文件,即使是中等质量的文件也是相当大的

因为我想同时播放多个音乐文件并控制是否循环播放,所以我认为后一个可能是我的解决方案

我没有把音乐文件放在我的项目中,所以加载功能对我来说不起作用,相反,我把它们放在数据库中,在我得到所有字节后,我就可以播放它了,下面是代码片段:

MemoryStream stream = new MemoryStream(bytes);
SoundEffect sound = SoundEffect.FromStream(stream);
SoundEffectInstance soundInstance = sound.CreateInstance();
if (loopValue.Number == 1.0) soundInstance.IsLooped = true;
soundInstance.Play();
这对wav文件很有效,但如果在我使用它播放mp3文件时引发异常:

System.Exception: 对 COM 组件的调用返回了错误 HRESULT E_FAIL。
位于 Microsoft.Xna.Framework.Audio.XcpImports.CheckHResult(UInt32 hr)
位于 Microsoft.Xna.Framework.Audio.XcpImports.SoundEffect_LoadWavFromStream(SoundEffect soundEffect, Stream stream)
位于 Microsoft.Xna.Framework.Audio.SoundEffect.FromStream(Stream stream)
....
我还没有在silverlight平台上找到任何可以直接将mp3转换为wav的库,我不太了解SoundEffect的内部,所以有谁能告诉我如何将mp3字节流转换为wav,以便SoundEffect可以工作

顺便说一句,由于性能问题,我不会使用wcf服务发送字节,并在托管的web应用程序中转换它们,这会给我的服务器带来很大的压力,所以类似于库的可能没有帮助

因此,对于这个难题的任何伟大解决方案,我都将感谢您的帮助。

您可以尝试从MP3获取原始音频数据。我建议使用DynamicSoundEffectInstance see直接输出音频,而无需经过WAV格式的流

免责声明:我是NLayer的主要贡献者


祝你好运

谢谢你的重播,但NLayer几乎没有文档,我是新手,所以你有一些演示或博客可以告诉我如何使用它吗?不是真的。。。关键是MpegFile类。调用ReadSamplesfloat[],int,int方法来收集样本。如果需要查找,请将时间设置为要查找的位置。您也可以使用Position属性,但它以字节为单位。我使用ReadSamples收集mp3字节的样本:MemoryStream stream=new MemoryStream Content;MpegFile file=新的MpegFilestream;int result=file.ReadSamplescontent,0,content.Length;当我在ReadSamples之后检查内容时,我找不到与二进制数据的任何部分匹配的结果使用记事本打开mp3。你能告诉我为什么吗?以及如何重新组织示例数据。您不会在MP3文件中找到它。。。MP3是一种压缩格式,因此在文件中找不到实际的原始音频数据。ReadSamples返回未压缩的音频数据,然后可以按照与任何其他原始音频数据相同的方式对其进行处理和/或输出。请注意,ReadSamples的字节[]重载更难处理。。。尝试改用float[]重载。