最近我一直在做关于如何在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这样的库可能没有帮助。
因此,任何伟大的解决这个难题,我会感谢您的帮助。
感谢您的回放,但NLayer几乎没有任何文档,我是新手,因此您是否有一些演示或博客可以告诉我如何使用它? – Rocky 2014-09-26 01:02:46
不是真的......关键是MpegFile类。调用ReadSamples(float [],int,int)方法来收集样本。如果您需要查找,请将Time设置为您要查找的位置(您也可以使用Position属性,但它以字节为单位)。 – ioctlLR 2014-09-26 12:03:52
我使用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