多媒体概述

Windows Presentation Foundation(WPF)中的多媒体功能使你能够将音频和视频集成到应用程序中,以增强用户体验。 本主题介绍 WPF 的多媒体功能。

媒体 API

这些 MediaElementMediaPlayer 类用于演示音频或视频内容。 这些课程可以通过交互方式或时钟来进行控制。 这些类可以在Microsoft Windows Media Player 10 控件上用于媒体播放。 使用哪个类取决于具体情况。

MediaElement布局支持的,UIElement可以用作许多控件的内容。 它还可用于可扩展应用程序标记语言(XAML)以及代码。 MediaPlayer另一方面,是为 Drawing 对象设计的,并且缺少布局支持。 使用 MediaPlayer 加载的媒体只能通过 VideoDrawing 或直接与 DrawingContext 进行互动。 MediaPlayer 不能在 XAML 中使用。

有关绘图对象和绘图上下文的详细信息,请参阅 “绘图对象概述”。

注释

使用应用程序分发媒体时,不能将媒体文件用作项目资源。 在项目文件中,您必须将媒体类型设置为Content,并将CopyToOutputDirectory设置为PreserveNewestAlways

媒体播放模式

注释

两者都有MediaElementMediaPlayer类似的成员。 本节中的链接引用类 MediaElement 成员。 除非特别指出,与MediaElement类相关的成员也可以在MediaPlayer类中找到。

若要了解 Windows Presentation Foundation 中的媒体播放(WPF),需要了解可播放媒体的不同模式。 MediaElementMediaPlayer都可以用于两种不同的媒体模式:独立模式和时钟模式。 媒体模式由 Clock 属性确定。 当 Clocknull时,媒体对象处于独立模式。 当非 Clock null 时,媒体对象处于时钟模式。 默认情况下,媒体对象处于独立模式。

独立模式

在独立模式下,媒体内容驱动媒体播放。 独立模式启用以下选项:

  • 媒体的Uri可以直接指定。

  • 可以直接控制媒体播放。

  • 媒体的PositionSpeedRatio属性可以被修改。

通过设置MediaElement对象的Source属性或调用MediaPlayer对象的Open方法加载媒体。

若要以独立模式控制媒体播放,可以使用媒体对象的控制方法。 可用的控件方法包括PlayPauseCloseStop。 在MediaElement中,使用这些方法的交互式控件仅当LoadedBehavior被设置为Manual时可用。 当媒体对象处于时钟模式时,这些方法不可用。

要了解独立模式的示例,请参阅“控制 MediaElement”(播放、暂停、停止、音量和速度)。

时钟模式

在时钟模式下,MediaTimeline 进行媒体播放。 时钟模式具有以下特征:

  • 通过MediaTimeline间接设置媒体的Uri

  • 媒体播放可由时钟控制。 不能使用媒体对象的控件方法。

  • 通过设置 MediaTimeline 对象的 Source 属性、从时间线创建时钟以及将时钟分配给媒体对象来加载媒体。 媒体会在MediaTimelineStoryboard内部并用于目标MediaElement时也以这种方式加载。

若要在时钟模式下控制媒体播放,必须使用 ClockController 控制方法。 从 ClockController 属性中获取了一个 ClockController,来自 MediaClock。 如果在时钟模式下尝试使用 MediaElementMediaPlayer 对象的控制方法,将会抛出一个 InvalidOperationException

有关时钟和时间线的详细信息,请参阅 动画概述

关于时钟模式的示例,请参阅使用 Storyboard 控制 MediaElement

MediaElement 类

将媒体添加到应用程序非常简单,只需向应用程序的用户界面(UI)添加 MediaElement 控件,并向要包括的媒体提供一个 Uri 控件。 Windows Presentation Foundation(WPF)支持Microsoft Windows Media Player 10 支持的所有媒体类型。 以下示例演示了可扩展应用程序标记语言(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 的默认行为是由属性 LoadedBehaviorUnloadedBehavior 控制。

控制媒体元素

LoadedBehaviorUnloadedBehavior属性分别在IsLoadedtruefalse时控制MediaElement的行为。 MediaState 属性被设置为影响媒体播放行为。 例如,默认值 LoadedBehaviorPlay 默认值,默认值 UnloadedBehaviorClose。 这意味着,一旦 MediaElement 加载并预卷完成,媒体就会开始播放。 播放完成后,媒体将关闭并释放所有媒体资源。

属性LoadedBehaviorUnloadedBehavior并不是控制媒体播放的唯一方法。 在时钟模式下,时钟可以控制MediaElement,而当LoadedBehaviorManual时,交互控制方法可以介入。 MediaElement 通过评估以下优先级来处理此控制竞争。

  1. UnloadedBehavior。 媒体卸载后就位。 这可确保即使MediaClockMediaElement相关联,也默认情况下释放所有媒体资源。

  2. MediaClock。 当媒体有一个 Clock 时,就位。 如果媒体已卸载,并且UnloadedBehaviorManual,那么MediaClock将生效。 时钟模式始终覆盖MediaElement的加载行为。

  3. LoadedBehavior。 媒体加载后即处于就位状态。

  4. 交互式控件方法。 当LoadedBehavior处于Manual时。 可用的控件方法包括PlayPauseCloseStop

显示媒体元素

若要显示MediaElement,它必须具有内容才能呈现,而且在加载内容之前,其ActualWidthActualHeight属性将被设置为零。 对于仅音频内容,这些属性始终为零。 对于视频内容,一旦 MediaOpened 事件被触发,ActualWidthActualHeight 将报告加载的媒体大小。 这意味着,在加载媒体之前,MediaElement不会占用用户界面(UI)中的任何物理空间,除非设置了WidthHeight属性。

WidthHeight属性的设置将导致媒体拉伸至填满为该MediaElement元素提供的区域。 若要保留媒体的原始纵横比,应仅设置 Width 属性或 Height 属性,而不是同时设置这两者。 设置WidthHeight属性将导致媒体呈现为不理想的固定元素大小。

为了避免固定大小的元素,Windows Presentation Foundation(WPF)可以预加载媒体。 这可以通过将LoadedBehavior设置为PlayPause之一来完成。 在Pause状态下,媒体将预卷并显示第一帧。 在一种 Play 状态下,媒体将预加载并开始播放。

MediaPlayer 类

MediaElement 类是框架元素,而 MediaPlayer 类被设计成用于 Drawing 对象。 当可以牺牲框架级别功能以获得性能优势或需要 Freezable 功能时,将使用绘图对象。 MediaPlayer 使你能够在应用程序中提供媒体内容的同时利用这些功能。 就像 MediaElement 一样,MediaPlayer 可以在独立模式或时钟模式下使用,但不具有 MediaElement 对象的卸载和加载状态。 这减少了播放控件的复杂性 MediaPlayer

控制 MediaPlayer

由于 MediaPlayer 是无状态的,因此只有两种方法来控制媒体播放。

  1. 交互式控件方法。 处于独立模式(nullClock 属性)时就位。

  2. MediaClock。 媒体在具有 Clock 时到位。

显示媒体播放器

从技术上说,由于它没有物理表示形式, MediaPlayer 因此无法显示。 但是,它可用于通过类VideoDrawingDrawing中呈现媒体。 以下示例演示如何使用 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,请参阅“绘图对象概述”。

另请参阅