0

我正在尝试从对话框中打开一个文件,然后在 XNA 中使用 MediaPlayer 播放它,但是,我的打开器将文件作为 Stream 类打开,我不知道如何将它转换为 Song 类,所以我可以用 MediaPlayer 播放,有帮助吗?

Stream myStream = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.InitialDirectory = "c:\\";
openFileDialog1.Filter = "mp3 files (*.mp3)|*.mp3|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;

if (openFileDialog1.ShowDialog() == DialogResult.OK) {
    try {
        if ((myStream = openFileDialog1.OpenFile()) != null) {
            using (myStream) {

            }
        }
    } catch (Exception ex) {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
}
4

2 回答 2

0

他们的 API 似乎提供对资源的只读访问。更多微软“安全”和“安全”问题(翻译、DRM 和开放访问问题。)

简短的回答,看起来你不能只使用他们的 API。

在代码中,一切皆有可能。您可以这样做...但您可能必须实现一个适配器,该适配器将转到他们记录的 API。由于 Song 是密封的而不是接口,因此他们显然试图成为专有产品并阻止您这样做。使用.NET Reflector可以轻松处理,但这会变得很痛苦。您必须定义自己的接口并在两者之间进行转换。当他们更改其内部结构时,您的代码将中断,您必须弄清楚如何写入 MediaLibrary 以及所有这些。

基本上,如果你不知道自己在做什么,你可能做不到。如果你这样做了,这可能是一个巨大的痛苦。如果您可以找到另一个库(例如,您的目标是 Windows 桌面),那么您最好朝那个方向前进。

于 2012-08-21T21:51:18.940 回答
0

你不能那样做。XNA 将音乐播放交给内部媒体播放器组件。它无法从 a 加载音乐Stream(如果我不得不猜测,它可能实现了自己的流媒体)。它可以做的是加载一个音乐文件,给定一个文件名。

你可以这样做:

Song mySong = Song.FromUri(@"file:///" + openFileDialog1.FileName);

值得指出的是,如果文件路径包含空格,则存在已知错误。但是您可以使用一种内部方法,它直接采用文件名并且不会显示错误 - 我在这个答案中讨论了如何使用它。这是:

internal Song(string name, string filename, int duration);

值得指出的是,这与内容管道所做的几乎相同。如果你查看.xnb它为一首歌曲生成的文件,它很小——只有几个字节。它所包含的只是要加载的歌曲的文件名。歌曲文件本身只是单独复制。

于 2012-08-23T05:58:39.457 回答