gpt4 book ai didi

c# - 读取音频文件以使用 MediaPlayer (WPF) 流式传输

转载 作者:行者123 更新时间:2023-12-04 03:03:32 25 4
gpt4 key购买 nike

我使用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

关于c# - 读取音频文件以使用 MediaPlayer (WPF) 流式传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com