2014-09-25 79 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