2

嘿,当尝试Song.fromUri()从我的 HDD(file:///...)加载歌曲(通过 Uri)()时,Mediaplayer 抛出异常。经过一番谷歌搜索后,我发现这个问题与 Uri 中的空间有关,所以我尝试转义它:

Uri.escapeUriString()不工作,结果是一个新的 Uri 对象,包含 null。相同的事情uri.escapeDataString()或不同的解决方案。

有没有更简单的方法可以将外部 mp3 加载到 XNA 中?

4

1 回答 1

2

最简单的方法是使用反射来访问这个内部构造函数:

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 上真正访问文件系统的随机位。)

于 2011-04-29T07:53:42.493 回答