MediaElement 是一個 UIElement,它受 布局系統 支持並可用作許多控件的內容。它也可用在可擴展應用程序標記語言 (XAML) 以及代碼中。另一方面,MediaPlayer 用於 Drawing 對象,因而缺少對布局的支持。只能使用 VideoDrawing 或通過直接與 DrawingContext 進行交互來呈現使用 MediaPlayer 加載的媒體。不能在 XAML 中使用 MediaPlayer。
說明: 如果將媒體與應用程序一起分發,則不能將媒體文件用作項目資源。在項目文件中,必須將媒體類型改設為 Content,並將 CopyToOutputDirectory 設置為 PreserveNewest 或 Always。
媒體播放模式 說明: MediaElement 和 MediaPlayer 具有類似的成員。本部分中的鏈接指的是 MediaElement 類成員。除非明確說明,否則鏈接到 MediaElement 類中的成員也可在 MediaPlayer 類中找到。
若要了解 Windows Presentation Foundation (WPF) 中的媒體播放,需要先了解可播放媒體的不同模式。MediaElement 和 MediaPlayer 可以用於兩種不同的媒體模式中:獨立模式和時鍾模式。媒體模式由 Clock 屬性確定。如果 Clock 為 null,則媒體對象處於獨立模式。如果 Clock 不為 null,則媒體對象處於時鍾模式。默認情況下,媒體對象處於獨立模式。
獨立模式 在獨立模式下,由媒體內容驅動媒體播放。獨立模式實現了下列功能選項:
可直接指定媒體的 Uri。
可直接控制媒體播放。
可修改媒體的 Position 和 SpeedRatio 屬性。
通過設置 MediaElement 對象的 Source 屬性或者調用 MediaPlayer 對象的 Open 方法來加載媒體。
若要在獨立模式下控制媒體播放,可使用媒體對象的控制方法。提供了下列控制方法:Play、Pause、Close 和 Stop。對於 MediaElement,僅當將 LoadedBehavior 設置為 Manual 時,使用這些方法的交互式控件才可用。當媒體對象處於時鍾模式時,這些方法將不可用。
時鍾模式 在時鍾模式下,由 MediaTimeline 驅動媒體播放。時鍾模式具有下列特征:
媒體的 Uri 是通過 MediaTimeline 間接設置的。
可由時鍾控制媒體播放。不能使用媒體對象的控制方法。
可通過以下方法加載媒體:設置 MediaTimeline 對象的 Source 屬性,從時間線創建時鍾,並將時鍾分配給媒體對象。當位於 Storyboard 中的 MediaTimeline 針對 MediaElement 時,也可用這種方法加載媒體。
若要在時鍾模式下控制媒體播放,必須使用 ClockController 控制方法。ClockController 是從 MediaClock 的 ClockController 屬性獲取的。如果嘗試在時鍾模式下使用 MediaElement 或 MediaPlayer 對象的控制方法,則會引發 InvalidOperationException。
MediaElement 類 向應用程序添加媒體的操作十分簡單,只需向應用程序的用戶界面 (UI) 添加 MediaElement 控件,並為要包含的媒體提供 Uri。Windows Presentation Foundation (WPF) 中支持 Microsoft Windows Media Player 10 所支持的所有媒體類型。下面的示例演示 MediaElement 在可擴展應用程序標記語言 (XAML) 中的簡單用法。
在此示例中,媒體在加載后即會自動播放。播放完后,就會關閉媒體,並且會釋放所有媒體資源(包括視頻內存)。此行為是 MediaElement 對象的默認行為,由 LoadedBehavior 和 UnloadedBehavior 屬性控制。
控制 MediaElement 當 IsLoaded 為 true 或 false 時,可分別使用 LoadedBehavior 和 UnloadedBehavior 屬性控制 MediaElement 的行為。設置 MediaState 屬性的目的是影響媒體播放行為。例如,默認的 LoadedBehavior 為 Play,而默認的 UnloadedBehavior 為 Close。這意味着加載 MediaElement 並完成預播放后,即會開始播放媒體。播放完后,就會關閉媒體,並且會釋放所有媒體資源。
LoadedBehavior 和 UnloadedBehavior 屬性不是控制媒體播放的唯一方法。在時鍾模式下,時鍾可以控制 MediaElement,並且這些交互式控制方法在 LoadedBehavior 為 Manual 時具有控制權。MediaElement 通過計算下列優先級來處理此控制權的競爭。
UnloadedBehavior. 在卸載媒體時發生。這可確保默認情況下釋放所有媒體資源,即使 MediaClock 與 MediaElement 關聯也是如此。
MediaClock. 在媒體具有 Clock 時發生。如果卸載媒體,則只要 UnloadedBehavior 為 Manual,MediaClock 就會生效。時鍾模式始終重寫 MediaElement 的加載行為。
LoadedBehavior. 在加載媒體時發生。
交互式控制方法。在 LoadedBehavior 為 Manual 時發生。提供了下列控制方法:Play、Pause、Close 和 Stop。
顯示 MediaElement 若要顯示 MediaElement,它必須具有要呈現的內容,並在加載內容之前將其 ActualWidth 和 ActualHeight 屬性設置為零。對於僅包含音頻的內容,這些屬性將始終為零。對於視頻內容,在 MediaOpened 事件引發 ActualWidth 和 ActualHeight 后,會報告已加載媒體的大小。這意味着在加載媒體之前,MediaElement 不會占用用戶界面 (UI) 中的任何物理空間,除非設置了 Width 或 Height 屬性。
如果設置 Width 和 Height 屬性,則會導致拉伸媒體來填充為 MediaElement 提供的區域。若要保持媒體的原始縱橫比,應設置 Width 或 Height 屬性,但不能同時設置這兩者。如果同時設置 Width 和 Height 屬性,則會使媒體以固定元素大小顯示,可能無法達到預期效果。
為避免元素大小固定,Windows Presentation Foundation (WPF) 可以預播放媒體。為此,需要將 LoadedBehavior 設置為 Play 或 Pause。在 Pause 狀態下,媒體將預播放第一幀。在 Play 狀態下,媒體將預播放,然后再開始播放。
MediaPlayer 類 當 MediaElement 類為框架元素時,MediaPlayer 類設計為在 Drawing 對象中使用。在可犧牲框架級功能來獲得性能的提高或者需要 Freezable 功能時,可使用 Drawing 對象。通過 MediaPlayer,您可以在應用程序中提供媒體內容,同時使用這些功能。與 MediaElement 類似,MediaPlayer 可在獨立模式或時鍾模式下使用,但不具有 MediaElement 對象的卸載和加載狀態。這會降低 MediaPlayer 的播放控制的復雜程度。
控制 MediaPlayer 由於 MediaPlayer 是無狀態的,因此只能使用兩種方法控制媒體播放。
交互式控制方法。在處於獨立模式(null Clock 屬性)時采用。
MediaClock. 在媒體具有 Clock 時采用。
顯示 MediaPlayer 從技術角度來說,不能顯示 MediaPlayer,因為它沒有物理表示形式。但它可用於通過使用 VideoDrawing 類在 Drawing 中呈現媒體。下面的示例演示如何使用 VideoDrawing 顯示媒體。
詳細請參考:http://www.codesky.net/article/200808/130108.html