2014-09-25 77 views
0

最近我一直在做关于如何在Silverlight应用程序中播放音乐的一些研究,这是形势我面对现在:如何MP3流转换为WAV流在Silverlight

(1)我可以使用MediaElement,但它一次只能播放一个音乐文件,由于我无法在我的项目中使用usercontrols,因此这可能不是解决方案。 (2)我可以使用SoundEffect,但它只支持即使在中等质量下也非常大的wav文件。

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

我没有在我的项目中放置音乐文件(所以Load<Song>函数不适用于我),相反,我把它们放在数据库中,得到所有字节后我可以播放它,下面是代码的片段:

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,但我并不清楚SoundEf的内部所以谁是谁可以告诉我如何将MP3字节流转换为WAV,所以SoundEffect可以工作?

顺便说一下,由于性能问题,我不会使用wcf服务发送字节,并将它们转换为托管的web应用程序,这会给我的服务器增加很多压力,所以像NAudio这样的库可能没有帮助。

因此,任何伟大的解决这个难题,我会感谢您的帮助。

回答

0

您可能会试着从NLayer获取MP3中的原始音频数据。我建议使用DynamicSoundEffectInstance(请参阅this answer)直接输出音频(不经过WAV格式流)。

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

祝你好运!

+0

感谢您的回放,但NLayer几乎没有任何文档,我是新手,因此您是否有一些演示或博客可以告诉我如何使用它? – Rocky 2014-09-26 01:02:46

+0

不是真的......关键是MpegFile类。调用ReadSamples(float [],int,int)方法来收集样本。如果您需要查找,请将Time设置为您要查找的位置(您也可以使用Position属性,但它以字节为单位)。 – ioctlLR 2014-09-26 12:03:52

+0

我使用ReadSamples来收集mp3字节的样本: MemoryStream stream = new MemoryStream(content); MpegFile file = new MpegFile(stream); int result = file.ReadSamples(content,0,content.Length); 当我在ReadSamples之后检查内容时,找不到与二进制数据的任何部分相匹配的结果(使用记事本打开mp3)。 你能告诉我为什么吗?以及如何重新组织样本数据。 – Rocky 2014-10-08 08:44:18