我MediaPlayer
用来播放音频文件
var mediaPlayer = new MediaPlayer();
mediaPlayer.Open(new Uri(s));
mediaPlayer.Play();
有时我需要删除MediaPlayer
仍在播放的文件。我想我已经以某种方式读取文件以流式传输以免费访问它以删除它。我的意思是我有办法读取文件以进行流式传输,或者我必须创建一些临时文件。要播放的文件,在这种情况下我可以删除原始文件还是有其他选项?
如何实施?
谢谢!
实际上,当您调用 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();
另一种选择是在打开文件之前简单地复制文件。这样你就可以随时删除原件。不过,您也可以只“标记”要删除的文件。当用户播放完文件后,您可以关闭并删除它。
另一种选择是使用名为 BoxedApp 的第 3 方库。它似乎允许您拥有一个包含内存流的“虚拟文件”。然后,您可以获得指向此虚拟文件的 Uri 并将其加载到媒体播放器中。查看 user1108125 的这个答案,了解如何使用这个 BoxedApp 库(我从未使用过)。https://stackoverflow.com/a/8587166/1721136