【问题标题】:XNA Content Pipeline Load .wav Files At RuntimeXNA 内容管道在运行时加载 .wav 文件
【发布时间】:2013-07-18 17:41:47
【问题描述】:

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

提前致谢!

【问题讨论】:

    标签: c# xna runtime xna-4.0 content-pipeline


    【解决方案1】:

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

    【讨论】:

    • 太完美了!非常感谢!
    【解决方案2】:

    您可以尝试将其流入/流出字节数组(如 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,所以它可能是准确的

    【讨论】:

    • 谢谢!但是,TitleContainer.OpenStream 需要一个相对 URI,但我希望能够从计算机上的任何位置播放歌曲。如果 DynamicSoundEffect 无法做到这一点,那么 XNA 到底在哪里寻找文件?
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多