0

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

4

2 回答 2

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;
}
于 2014-12-16T04:21:42.080 回答
1

没有直接的方法。这是可能的——至少有两种方法可以做到。但这并不容易。

MediaElement处理其源流的处理方式很棘手,因为它在内部使用 Windows Media Player(这意味着它在幕后使用 MediaFoundation 或 DirectShow,具体取决于您运行的 Windows 版本)。编写某种拦截器来中继底层流同时将其保存到磁盘的“明显”解决方案是可能的,但是您必须离开 .NET 的世界才能做到这一点,因为MediaElement不适用于 .NET 流。

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

这是不平凡的。

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

于 2013-08-12T12:05:30.313 回答