C# XNA内容管道在运行时加载.wav文件
我正在尝试使用XNA Game Studio在运行时加载一首歌曲。但是,它不是.xnb格式,除非在程序首次编译时它位于Content Project文件夹中。由于我想从计算机上的任何位置检索文件并将其与内容管道一起加载,我不知道该做什么,除了让用户在启动程序之前将歌曲放入内容项目文件夹之外。然而,我想知道是否有更好、更方便用户的方法来实现这一点。 此外,当应用程序发布时,他们将无法在Content Project文件夹中放置任何内容,因为只有.exe将被发布,而不是实际的VS2012解决方案。有没有一种方法可以在运行时加载文件,而不将其放在Content Project文件夹中C# XNA内容管道在运行时加载.wav文件,c#,xna,runtime,xna-4.0,content-pipeline,C#,Xna,Runtime,Xna 4.0,Content Pipeline,我正在尝试使用XNA Game Studio在运行时加载一首歌曲。但是,它不是.xnb格式,除非在程序首次编译时它位于Content Project文件夹中。由于我想从计算机上的任何位置检索文件并将其与内容管道一起加载,我不知道该做什么,除了让用户在启动程序之前将歌曲放入内容项目文件夹之外。然而,我想知道是否有更好、更方便用户的方法来实现这一点。 此外,当应用程序发布时,他们将无法在Content Project文件夹中放置任何内容,因为只有.exe将被发布,而不是实际的VS2012解决方案。有
提前谢谢 您可以尝试将其流式传输到字节数组中/从字节数组中传输(如MSDN中所述) 基本上,在
LoadContent()
函数中使用TitleContainer.OpenStream(@“soundfile.wav”)
来创建System.IO.Stream
对象。然后使用新二进制读取器(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,所以它可能是准确的XNA包含处理这种情况的内置方法(不需要Pat回答中的所有代码!)
@“C:\Myfile.wav”
可以是相对路径或绝对路径。谢谢!但是,TitleContainer.OpenStream需要一个相对URI,但我希望能够在计算机上的任何位置播放歌曲。如果使用DynamicSoundEffect无法实现这一点,那么XNA究竟在哪里查找该文件?这太完美了!非常感谢!
System.IO.FileStream fs = new System.IO.FileStream(@"C:\Myfile.wav", System.IO.FileMode.Open);
SoundEffect mysound = SoundEffect.FromStream(fs);
fs.Dispose();