使用MediaPlayer(WPF)读取要传输的音频文件

时间:2012-11-12 17:57:48

标签: c# .net wpf

我使用MediaPlayer播放音频文件

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

有时我需要删除MediaPlayer仍在播放的文件。 我想我已经以某种方式读取文件流以获得免费访问权限以便删除它。我的意思是我有办法读取文件到流或我必须创建一些临时。要播放的文件,在这种情况下,我可以删除原始文件还是有其他选项?

如何实施?

谢谢!

1 个答案:

答案 0 :(得分:3)

实际上,当您调用MediaPlayer.Open时,它会自动通过流读取文件。问题是当您尝试删除文件时,流仍处于打开状态。

MediaPlayer上有 .Close 方法。调用此方法将关闭正在文件中读取的流。

这是关于MediaPlayer类的文档,因此您可以看到可以使用的其他方法:http://msdn.microsoft.com/en-us/library/system.windows.media.mediaplayer.aspx

编辑:如果您不介意播放器在您拨打关闭时停止播放,那么您可以关闭&然后删除你的文件。如果你确实需要继续播放,那么你需要采用不同的方法。

如果您正在使用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();

另一种选择是在打开文件之前简单地复制一份文件。这样你就可以随时删除原件了。但是,您也可以“标记”要删除的文件。当用户完成播放文件后,您可以关闭&删除它。

另一个选项是使用名为BoxedApp的第三方库。它似乎将允许您拥有包含内存流的“虚拟文件”。然后,您可以获得指向此虚拟文件的Uri并将其加载到媒体播放器中。看看这个答案 user1108125看看如何使用这个BoxedApp库(我从未使用过)。 https://stackoverflow.com/a/8587166/1721136