You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MonoGame技术问题:从MemoryStream加载SoundEffect失败

问题描述

计划将所有.wav文件打包到一个文件中再加载,实际操作时出现异常。

打包代码:

using (var fs = File.Create("sounds"))
{
    using (var bw = new BinaryWriter(fs))
    {
        var data = File.ReadAllBytes("test.wav");
        bw.Write(data.Length);
        bw.Write(data);
    }
}

加载代码:

using (MemoryStream ms = new MemoryStream())
{
    using (var fs = File.OpenRead("sounds"))
    {
        using (var br = new BinaryReader(fs))
        {
            var length = br.ReadInt32();
            var data = br.ReadBytes(length);
            ms.Write(data);
        }
    }

    var sound = SoundEffect.FromStream(ms);
}

运行时抛出异常:Specified stream is not a wave file.

问题原因

你把WAV数据写入MemoryStream后,流的Position指针停留在了流的末尾。SoundEffect.FromStream需要从流的起始位置读取完整的WAV文件头和数据,此时从末尾开始读相当于没有有效数据,自然会判定不是合法的WAV文件。

解决方案

在调用SoundEffect.FromStream之前,把MemoryStream的Position重置为0,让读取操作从流的开头开始:

using (MemoryStream ms = new MemoryStream())
{
    using (var fs = File.OpenRead("sounds"))
    {
        using (var br = new BinaryReader(fs))
        {
            var length = br.ReadInt32();
            var data = br.ReadBytes(length);
            ms.Write(data);
            // 重置流指针到起始位置
            ms.Position = 0;
        }
    }

    var sound = SoundEffect.FromStream(ms);
}

补充说明:如果后续要打包多个WAV文件,记得每个文件都按「长度+字节数据」的格式写入,读取时也要依次读取长度和对应数据,处理每个WAV前都要重置对应流的Position指针。

内容的提问来源于stack exchange,提问作者Piasiu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:32:16