2013-08-12 70 views
1

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

回答

1

有没有简单的方法。这是可能的 - 至少有两种方法可以做到这一点。但这并不容易。因为它在内部使用Windows Media Player(这意味着它使用MediaFoundation或DirectShow在封面下,具体取决于您正在运行的是哪个Windows版本),因此干预MediaElement如何处理其源流是很困难的。编写某种拦截器来传递底层流并将其保存到磁盘的“显而易见的”解决方案是可能的,但是你必须离开.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客户端类型之一来获取数据,同时保存副本并向上提供该数据。这也是非平凡的,但可能比编写自定义源过滤器更容易。

0

我发现,如果我设置下载文件的文件大小之前,我开始下载,那么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; 
}