3

MediaPlayerオーディオファイルの再生に使用します

var mediaPlayer = new MediaPlayer(); 
mediaPlayer.Open(new Uri(s));
mediaPlayer.Play();

MediaPlayer時々、まだ再生中のファイルを削除する必要があります。私はどういうわけかそれを削除するためにそれへの自由なアクセスを得るためにストリーミングするためにファイルを読んだと思います。つまり、ファイルを読み取ってストリーミングする方法がないか、一時的なものを作成する必要があります。再生するファイル。この場合、元のファイルを削除できますか、それとも他のオプションがありますか?

それを実装する方法は?

ありがとうございました!

4

1 に答える 1

4

実際、MediaPlayer.Open を呼び出すと、ストリーム経由でファイルが自動的に読み込まれます。問題は、ファイルを削除しようとしたときにストリームがまだ開いていることです。

MediaPlayer には.Closeメソッドがあります。これを呼び出すと、ファイルを読み込んでいるストリームが閉じられます。

ここに MediaPlayer クラスのドキュメントがあるので、他に使用できるメソッドを確認できます: http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.aspx

編集: Close を呼び出したときにプレーヤーが再生を停止してもかまわない場合は、ファイルを閉じて削除するだけです。続行するために再生が必要な場合は、別のアプローチが必要になります。

Silverlight を使用している場合は、ストリームを直接 MediaElement にロードできます。

var bytes = File.ReadAllBytes(@"c:\yourfile.ext");
var mStream = new MemoryStream(bytes);
mediaElement1.SetSource(mStream);

残念ながら、WPF には同じストリーム サポートがありません。ストリームをリソース パックに書き込んで、MemoryStream の Uri を取得しようとしました。ただし、テストでは正しく再生できませんでした。あなたがそれをいじり、おそらくそれを機能させたい場合に備えて、私が持っていた私のソースを含めます:

  var bytes = File.ReadAllBytes(@"C:\Bill\TestWaveFiles\14043.wav");

  MemoryStream packStream = new MemoryStream()
  Package pack = Package.Open(packStream, FileMode.Create, FileAccess.ReadWrite);
  Uri packUri = new Uri("bla:");
  PackageStore.AddPackage(packUri, pack);
  Uri packPartUri = new Uri("/MemoryResource", UriKind.Relative);
  PackagePart packPart = pack.CreatePart(packPartUri, "Media/MemoryResource");
  packPart.GetStream().Write(bytes, 0, bytes.Length);
  var inMemoryUri = PackUriHelper.Create(packUri, packPart.Uri);


  mediaElement1.LoadedBehavior = MediaState.Manual;
  mediaElement1.Source = inMemoryUri;
  mediaElement1.Play();

もう 1 つのオプションは、ファイルを開く前に単純にファイルのコピーを作成することです。そうすれば、いつでもオリジナルを削除できます。ただし、削除するファイルを「マーク」することもできます。ユーザーがファイルの再生を終了したら、ファイルを閉じて削除できます。

追加のオプションの 1 つは、BoxedApp と呼ばれるサードパーティ ライブラリを使用することです。メモリストリームを含む「仮想ファイル」を作成できるようです。次に、この仮想ファイルを指す Uri を取得して、メディア プレーヤーにロードできます。この BoxedApp ライブラリの使用方法については、user1108125 によるこの回答を参照してください (これは使用したことがありません)。https://stackoverflow.com/a/8587166/1721136

于 2012-11-12T18:19:07.567 に答える