嘿,当尝试Song.fromUri()
从我的 HDD(file:///...)加载歌曲(通过 Uri)()时,Mediaplayer 抛出异常。经过一番谷歌搜索后,我发现这个问题与 Uri 中的空间有关,所以我尝试转义它:
Uri.escapeUriString()
不工作,结果是一个新的 Uri 对象,包含 null。相同的事情uri.escapeDataString()
或不同的解决方案。
有没有更简单的方法可以将外部 mp3 加载到 XNA 中?
最简单的方法是使用反射来访问这个内部构造函数:
internal Song(string name, string filename, int duration);
这是一些可以做到这一点的代码:
var ctor = typeof(Song).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance, null,
new[] { typeof(string), typeof(string), typeof(int) }, null);
song = (Song)ctor.Invoke(new object[] { "name", @"C:\My Music\Blah.mp3", 0 });
显然这并不理想。我不认为 XNA 运行时会进行次要版本更新(这意味着如果您的游戏使用 XNA 4.0,它始终是相同的运行时),但我不确定。通过使用内部构造函数,您的游戏完全受 Microsoft 二进制更新的支配。您可能需要一个不错的大型异常处理程序。
此外,我发现某些 MP3 文件会(字面上)静默地无法播放。此外,该Duration
属性显然没有通过这种方法填充。
(显然,这是仅限 Windows 的代码。但无论如何,您无法在 WP7 或 Xbox 上真正访问文件系统的随机位。)