XNA内容管道在运行时加载.wav文件

本文关键字:加载 wav 文件 运行时 管道 XNA | 更新日期: 2023-09-27 18:23:53

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

提前感谢!

XNA内容管道在运行时加载.wav文件

XNA包含处理此问题的内置方法(不需要Pat的答案中的所有代码!)

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

CCD_ 1可以是相对路径或绝对路径。

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

基本上,在LoadContent()函数中使用TitleContainer.OpenStream(@"soundfile.wav")来创建System.IO.Stream对象。然后到具有CCD_ 6的CCD_。

读取标题:

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,所以它可能是准确的