2013-08-12 105 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; 
}