【问题标题】:Read audio file to stream with MediaPlayer (WPF)使用 MediaPlayer (WPF) 读取音频文件以进行流式传输
【发布时间】:2012-11-12 17:57:47
【问题描述】:

我用MediaPlayer播放音频文件

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

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

如何实现?

谢谢!

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    实际上,当您调用 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

    【讨论】:

    • 因此,如果我在音频播放期间调用 Close() 方法,我可以删除正在播放的文件。
    • 是的,关闭会让你删除文件,但它也会停止播放文件。如果这不适合您,那么您可以将整个文件读入 byte[],将 byte[] 加载到 memoryStream 中,然后获取流的 Uri。 (如果您需要,我可以提供帮助)
    猜你喜欢
    • 1970-01-01
    • 2013-02-04
    • 2018-04-13
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2023-03-31
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多