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
相关产品推荐
相关产品推荐

