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

そんなことはできません。XNA は、音楽の再生を内部のメディア プレーヤー コンポーネントに渡します。から音楽をロードすることはできませんStream(推測する必要がある場合は、おそらく独自のストリーミングを実装しています)。できることは、ファイル名を指定して音楽ファイルをロードすることです。

次のようなことができます。

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

ファイルへのパスにスペースが含まれている場合、既知のバグがあることに注意してください。ただし、ファイル名を直接受け取り、バグを示さない内部的な方法があります。この回答でその使用方法について説明します。それは:

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

これは、コンテンツ パイプラインが行うこととほとんど同じであることを指摘しておく価値があります。ソング用に生成されるファイルを見ると.xnb、それは非常に小さく、ほんの数バイトです。含まれているのは、ロードする曲のファイル名だけです。曲ファイル自体は、個別にコピーされるだけです。

于 2012-08-23T05:58:39.457 に答える
0

彼らの API は、リソースへの読み取り専用アクセスを提供しているようです。Microsoft の「セキュリティ」と「安全性」に関するその他の懸念 (翻訳、DRM、およびオープン アクセスの問題)。

簡単に言えば、APIだけを使用できるようには見えません。

コードでは、すべてのことが可能です。これを行うことができます...しかし、おそらく文書化されたAPIに行くADAPTERを実装する必要があります。Song は封印されており、インターフェースではないため、彼らは明らかに独占的になり、ユーザーがこれを実行できないようにしようとしています。.NET Reflectorで簡単に対処できますが、これは苦痛になります。独自のインターフェイスを定義し、2 つの間で変換する必要があります。それらが内部構造を変更すると、コードが壊れてしまい、MediaLibrary などへの書き込み方法を理解する必要があります。

基本的に、自分が何をしているのかわからなければ、おそらくできないでしょう。もしそうなら、これはおそらく巨大な痛みです. 別のライブラリを見つけることができる場合 (たとえば、Windows デスクトップをターゲットにしている場合)、その方向に進んだほうがよいかもしれません。

于 2012-08-21T21:51:18.940 に答える