播放时WPF MediaElement下载文件

时间:2013-08-12 06:43:46

标签: c# .net wpf mediaelement

无论如何使用MediaElement从服务器播放文件(视频或音频类型)并同时将数据保存到特定文件位置,以便下次一次可以直接从本地系统加载。在我的项目中,我是使用WPF媒体元素

2 个答案:

答案 0 :(得分:1)

没有直截了当的方式。这是可能的 - 至少有两种方法可以做到。但这并不容易。

干扰MediaElement处理其源流的方式很棘手,因为它在内部使用Windows Media Player(这意味着它使用MediaFoundation或DirectShow,取决于您运行的Windows版本)。编写某种拦截器的“明显”解决方案可以传递基础流,同时也可以将其保存到磁盘,但是你必须离开.NET的世界才能做到这一点,因为MediaElement将无法使用一个.NET流。

这并不是说这是不可能的。您只需编写自定义源过滤器,并使用自定义协议实现进行设置。 http://msdn.microsoft.com/en-us/library/ms787558(VS.85).aspx描述了视频呈现基础架构如何根据传入的URL决定要创建哪种对象以表示视频源。MediaElement将源URL直接传递到此底层基础架构中,因此,您编写了自定义过滤器并将其与myhack:协议相关联,然后如果您将源设置为myhack://whatever,则最终会加载您的过滤器。如果您使过滤器成为http:过滤器周围的包装器,则可以将传入数据的副本保存到磁盘。

这不重要。

另一种方法是托管本地HTTP服务器。如果您可以选择打开可以侦听的本地套接字,那么您可以编写一个HTTP实现,该实现使用.NET的内置HTTP客户端类型之一来获取数据,同时保存副本并提供该数据。这也是非常重要的,但可能比编写自定义源过滤器更容易。

答案 1 :(得分:1)

我发现如果在开始下载之前设置下载文件的文件大小,那么MediaElement将在下载时播放整个视频/音频。

using (var httpClient = new HttpClient() {Timeout = TimeSpan.FromMinutes(25)})
using (var response = await httpClient.GetAsync(theDownloadUrl, HttpCompletionOption.ResponseHeadersRead))
using (var videoFileStream = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read)) {
    videoFileStream.SetLength(response.Content.Headers.ContentLength.GetValueOrDefault());
    var copying = response.Content.CopyToAsync(videoFileStream);
    //await Task.Delay(1000);
    MediaSource = fileName;
    await copying;
}