我正试图从对话框中打开一个文件,然后用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);
}
}
你不能那样做。XNA将音乐播放切换到内部媒体播放器组件。它无法从Stream
加载音乐(如果非要我猜测的话,它可能实现了自己的流媒体)。可以加载一个给定文件名的音乐文件。
你可以这样做:
Song mySong = Song.FromUri(@"file:///" + openFileDialog1.FileName);
值得指出的是,如果文件的路径包含空格,则存在已知的错误。但有一种内部方法可以直接使用文件名,并且不会显示错误——我在这个答案中讨论了如何使用它。它是:
internal Song(string name, string filename, int duration);
值得指出的是,这与内容管道做的事情几乎相同。如果您查看它为Song生成的.xnb
文件,它很小,只有几个字节。它所包含的只是要加载的歌曲的文件名。歌曲文件本身只是单独复制的。
他们的API似乎提供了对资源的只读访问。更多微软的"安全"one_answers"安全"问题(翻译、DRM和开放访问问题)
简短的回答,看起来你不能只使用他们的API。
在代码中,一切皆有可能。你可以这样做。。。但您可能需要实现一个适配器,该适配器指向其文档化的API。由于Song是密封的,而不是一个接口,所以他们显然试图成为专有的,并阻止你这样做。用.NET反射器很容易处理,但这会变成一种痛苦。您必须定义自己的接口,并在两者之间进行转换。当它们改变内部结构时,你的代码就会崩溃,你必须弄清楚如何写入MediaLibrary等等。
基本上,如果你不知道自己在做什么,你可能做不到。如果你这样做,这可能是一个巨大的痛苦。如果你能找到另一个库(例如,你的目标是Windows台式机),你最好朝着这个方向发展。