我使用MediaPlayer
播放音频文件
var mediaPlayer = new MediaPlayer();
mediaPlayer.Open(new Uri(s));
mediaPlayer.Play();
有时我需要删除MediaPlayer
仍在播放的文件。
我想我已经以某种方式读取文件流以获得免费访问权限以便删除它。我的意思是我有办法读取文件到流或我必须创建一些临时。要播放的文件,在这种情况下,我可以删除原始文件还是有其他选项?
如何实施?
谢谢!
答案 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