2013-07-18 60 views
2

我試圖加載使用XNA遊戲工作室在運行時的一首歌。但是,它不是.xnb格式,除非它在程序第一次編譯時位於Content Project文件夾中。當我想從計算機上的任何地方檢索文件,並與內容管道加載它,我不知道除了讓用戶把他們的歌曲到內容項目文件夾中,他們啓動該程序前要做什麼。但是,我想知道是否有更好,更人性化的方式來做到這一點。 此外,他們不會當應用程序被釋放,因爲只有.exe文件將被釋放,而不是實際VS2012的解決方案能夠把任何東西在內容項目文件夾都沒有。有沒有辦法在運行時加載文件,而不需要將它們放在Content Project文件夾中?XNA內容管道加載.wav文件在運行時

在此先感謝!

回答

2

XNA包含內置的方法來處理帕特回答這個(無需所有的codework! )

 System.IO.FileStream fs = new System.IO.FileStream(@"C:\Myfile.wav", System.IO.FileMode.Open); 
     SoundEffect mysound = SoundEffect.FromStream(fs); 
     fs.Dispose(); 

@"C:\Myfile.wav"可以是相對或絕對路徑。

+0

完美!非常感謝! – BalinKingOfMoria

0

你可以試試灑進/從一個字節數組(如在MSDN的Streaming Data from a WAV File描述)。

基本上,在您的LoadContent()函數中使用TitleContainer.OpenStream(@"soundfile.wav")可創建System.IO.Stream對象。然後到BinaryReadernew BinaryReader(wavStream)

閱讀頭:

int chunkID = reader.ReadInt32(); 
int fileSize = reader.ReadInt32(); 
int riffType = reader.ReadInt32(); 
int fmtID = reader.ReadInt32(); 
int fmtSize = reader.ReadInt32(); 
int fmtCode = reader.ReadInt16(); 
int channels = reader.ReadInt16(); 
int sampleRate = reader.ReadInt32(); 
int fmtAvgBPS = reader.ReadInt32(); 
int fmtBlockAlign = reader.ReadInt16(); 
int bitDepth = reader.ReadInt16(); 

if (fmtSize == 18) 
{ 
    // Read any extra values 
    int fmtExtraSize = reader.ReadInt16(); 
    reader.ReadBytes(fmtExtraSize); 
} 

int dataID = reader.ReadInt32(); 
int dataSize = reader.ReadInt32(); 

讀取的實際聲音數據:

byteArray = reader.ReadBytes(dataSize); 

然後一大堆的複雜的代碼來設置DynamicSoundEffect對象

(在上面的鏈接詳述)

然後,你可以使用dynamicSound.Play()dynamicSound.Stop()播放和停止你的聲音!

免責聲明:我沒有測試過的播放聲音這種方法,但它從MSDN的所以它可能準確

+0

謝謝!但是,TitleContainer.OpenStream需要一個相對URI,但我希望能夠從計算機上的任何位置播放歌曲。如果DynamicSoundEffect無法實現,那麼XNA在哪裏尋找文件? – BalinKingOfMoria