我正在尝试从对话框中打开一个文件,然后在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);
}
}
答案 0 :(得分:0)
他们的API似乎提供read only access to resources。更多Microsoft“安全”和“安全”问题(翻译,DRM和开放访问问题。)
简短回答,看起来您不能单独使用他们的API。
在代码中,一切皆有可能。你可以这样做......但是你可能需要实现一个ADAPTER来转换到他们记录的API。由于Song是密封的而不是界面,因此它们显然是在尝试专有并且让您无法做到这一点。很容易处理.NET Reflector,但这会变成一种痛苦。您必须定义自己的界面并在两者之间进行转换。当他们改变他们的内部时,你的代码会破裂,你将不得不弄清楚如何写入MediaLibrary以及所有这些。
基本上,如果你不知道自己在做什么,你可能不会。如果你这样做,这可能是一个巨大的痛苦。如果您可以找到另一个库(例如,您的目标是Windows桌面),那么最好朝这个方向发展。
答案 1 :(得分:0)
你不能这样做。 XNA将音乐播放切换到内部媒体播放器组件。它无法从Stream
加载音乐(如果我不得不猜测,它可能实现了自己的流媒体)。 可以做的是加载音乐文件,给定文件名。
你可以这样做:
Song mySong = Song.FromUri(@"file:///" + openFileDialog1.FileName);
值得指出的是,如果文件的路径包含空格,则存在已知错误。但是有一个内部方法可以直接使用文件名而不会出现错误 - 我在this answer讨论如何使用它。它是:
internal Song(string name, string filename, int duration);
值得指出的是,这与内容管道完全相同。如果你查看它为歌曲生成的.xnb
文件,它很小 - 只需几个字节。它包含的是要加载的歌曲的文件名。歌曲文件本身只是单独复制。