我正在尝试使用XNA Game Studio在运行时加载歌曲。但是,它不是.xnb格式,除非它在程序首次编译时位于Content Project文件夹中。由于我想从计算机上的任何位置检索文件并使用内容管道加载它,我不知道该怎么做,除非让用户在启动程序之前将他们的歌曲放入Content Project文件夹。但是,我想知道是否有更好,更用户友好的方式来做到这一点。 此外,当应用程序发布时,它们将无法在Content Project文件夹中放置任何内容,因为只会释放.exe,而不是实际的VS2012解决方案。有没有办法在运行时加载文件而不将它们放在Content Project文件夹中?
提前致谢!
答案 0 :(得分:3)
XNA包含内置的方法来处理这个问题(Pat的答案中不需要所有的代码工作!)
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"
可以是相对路径或绝对路径。
答案 1 :(得分:0)
您可以尝试将其流入/传出字节数组(如MSDN的Streaming Data from a WAV File所述)。
基本上,在TitleContainer.OpenStream(@"soundfile.wav")
函数中使用LoadContent()
来创建System.IO.Stream
对象。然后到BinaryReader
new 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所以它可能是准确的