多媒體概觀
Windows Presentation Foundation (WPF) 中的多媒體功能可讓您將音訊和視訊整合到您的應用程式中,以增強使用者體驗。 本主題介紹 WPF 的多媒體功能。
媒體 API
MediaElement 和 MediaPlayer 類別可用來呈現音訊或視訊內容。 您可以透過互動式的方式或是時鐘來控制這些類別。 這些類別可以用於 Windows Media Player 10 的媒體播放控制。 使用的類別需視案例而定。
MediaElement 是受版面配置支援的 UIElement,可作為許多控制項的內容來取用。 它也可在 Extensible Application Markup Language (XAML) 以及程式碼中使用。 另一方面,MediaPlayer 是針對 Drawing 物件而設計,並且缺乏版面配置支援。 使用 MediaPlayer 載入的媒體只能使用 VideoDrawing 或直接與 DrawingContext 互動來呈現。 MediaPlayer 不能在 XAML 中使用。
如需繪圖物件和繪圖內容的詳細資訊,請參閱繪圖物件概觀。
注意
在隨著您的應用程式散發媒體時,您無法使用媒體檔案做為專案資源。 在您的專案檔中,您必須改為將媒體類型設定為 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 時,才能使用這些方法的互動式控制。 當媒體物件處於時鐘模式時,無法使用這些方法。
如需獨立模式的範例,請參閱控制 MediaElement (播放、暫停、停止、音量和速度)。
時鐘模式
在時鐘模式中,MediaTimeline 會驅動媒體播放。 時鐘模式具有下列特性:
媒體的 Uri 會透過 MediaTimeline 間接設定。
可由時鐘來控制媒體播放。 無法使用媒體物件的控制方法。
藉由設定 MediaTimeline 物件的 Source 屬性、從時間軸建立時鐘,以及將時鐘指派給媒體物件,以載入媒體。 當 Storyboard 內的 MediaTimeline 以 MediaElement 為目標時,也會以這種方式載入媒體。
若要在時鐘模式中控制媒體播放,必須使用 ClockController 控制項方法。 ClockController 是從 MediaClock 的 ClockController 屬性中取得。 如果您在時鐘模式中嘗試使用 MediaElement 或 MediaPlayer 物件的控制項方法,則會擲回 InvalidOperationException。
如需時鐘和時間軸的詳細資訊,請參閱動畫概觀。
如需時鐘模式的範例,請參閱使用分鏡腳本控制 MediaElement。
MediaElement 類別
在應用程式中新增媒體非常簡單,只需在應用程式的使用者介面 (UI) 中新增 MediaElement 控制項並向您想要包含的媒體提供 Uri 即可。 Windows Presentation Foundation (WPF) 支援 Microsoft Windows Media Player 10 支援的所有媒體類型。 下列範例示範 Extensible Application Markup Language (XAML) 中 MediaElement 的簡單使用方式。
<!-- This page shows a simple usage of MediaElement -->
<Page x:Class="MediaElementExample.SimpleUsage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SimpleUsage"
>
<StackPanel Margin="20">
<MediaElement Source="media/numbers-aud.wmv" />
</StackPanel>
</Page>
在此範例中,媒體一載入就會自動播放。 媒體播放完之後,系統就會關閉媒體並釋放所有媒體資源 (包括視訊記憶體)。 這是 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 就會回報已載入的媒體大小。 這表示在載入媒體之前,除非設定 Width 或 Height 屬性,否則 MediaElement 不會佔用使用者介面 (UI) 中的任何實體空間。
設定 Width 和 Height 屬性會導致媒體延展以填滿為 MediaElement 提供的區域。 若要保留媒體的原始外觀比例,應設定 Width 或 Height 屬性,但不能同時設定兩者。 同時設定 Width 和 Height 屬性將導致媒體以固定的元素大小呈現,這可能是不理想的。
為了避免有固定的大小元素,Windows Presentation Foundation (WPF) 可以預載媒體。 這可藉由將 LoadedBehavior 設定為 Play 或 Pause 來完成。 在 Pause 狀態中,媒體會預載並呈現第一個畫面。 在 Play 狀態中,媒體將預載並開始播放。
MediaPlayer 類別
由於 MediaElement 類別是架構元素,因此 MediaPlayer 類別設計用於在 Drawing 物件中使用。 當您可以犧牲架構等級功能以獲得效能優勢或者需要 Freezable 功能時,請使用繪圖物件。 MediaPlayer 可在您的應用程式中提供媒體內容,同時也讓您利用這些功能。 如同 MediaElement,MediaPlayer 可用於獨立或時鐘模式,但不具有 MediaElement 物件的卸載和載入狀態。 這降低了 MediaPlayer 的播放控制項複雜度。
控制 MediaPlayer
因為 MediaPlayer 為無狀態,所以只有兩種方法可以控制媒體播放。
互動式控制方法。 處於獨立模式時取得控制權 (
null
Clock 屬性)。MediaClock. 當媒體具有 Clock 時取得控制權。
顯示 MediaPlayer
技術上來說,無法顯示 MediaPlayer,因為它沒有實體表示法。 然而,其可以用來使用 VideoDrawing 類別,在 Drawing 中呈現媒體。 下列範例示範如何使用 VideoDrawing 顯示媒體。
//
// Create a VideoDrawing.
//
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
VideoDrawing aVideoDrawing = new VideoDrawing();
aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
aVideoDrawing.Player = player;
// Play the video once.
player.Play();
如需有關 Drawing 物件的詳細資訊,請參閱繪圖物件概觀。