2

我正在尝试使用 XNA Game Studio 在运行时加载一首歌曲。但是,它不是 .xnb 格式,除非在首次编译程序时它位于 Content Project 文件夹中。由于我想从计算机上的任何位置检索文件并使用 Content Pipeline 加载它,所以除了让用户在启动程序之前将他们的歌曲放入 Content Project 文件夹之外,我不知道该怎么做。但是,我想知道是否有更好、更用户友好的方式来做到这一点。此外,当应用程序发布时,他们根本无法在 Content Project 文件夹中放置任何内容,因为只会发布 .exe,而不是实际的 VS2012 解决方案。有没有办法在运行时加载文件而不将它们放在 Content Project 文件夹中?

提前致谢!

4

2 回答 2

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"可以是相对路径或绝对路径。

于 2013-07-19T00:45:04.973 回答
0

您可以尝试将其流式传输到字节数组中(如 MSDN 的WAV 文件中的流式数据中所述)。

基本上,TitleContainer.OpenStream(@"soundfile.wav")在你的LoadContent()函数中使用来创建一个System.IO.Stream对象。然后来一个BinaryReaderwith 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()anddynamicSound.Stop()来播放和停止你的声音!

免责声明:我没有测试过这种播放声音的方法,但它来自 MSDN,所以它可能是准确的

于 2013-07-18T18:10:02.677 回答