多媒体概述

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

媒体 API

MediaElementMediaPlayer 类用于展示音频或视频内容。 可以以交互方式或时钟控制这些类。 这些类可以用在 Microsoft Windows Media Player 10 控件上进行媒体播放。 要使用哪个类取决于方案。

MediaElement 是受 Layout 支持的 UIElement,并可用作许多控件的内容。 它还可用于 Extensible Application Markup Language (XAML) 以及代码。 另一方面,MediaPlayer 专为 Drawing 对象设计,缺少布局支持。 使用 MediaPlayer 加载的媒体仅可使用 VideoDrawing 或通过直接与 DrawingContext 交互进行展示。 MediaPlayer 不能在 XAML 中使用。

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

注意

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

媒体播放模式

注意

MediaElementMediaPlayer 有类似的成员。 在此部分中的链接是指 MediaElement 类成员。 除非特别注明,否则 MediaElement 类中关联的成员也可在 MediaPlayer 类中找到。

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

独立模式

在独立模式下,媒体内容驱动媒体播放。 独立模式可实现下列选项:

  • 可以直接指定媒体的 Uri

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

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

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

要在独立模式下控制媒体播放,可使用媒体对象的控制方法。 可用的控制方法有 PlayPauseCloseStop。 对于 MediaElement,使用这些方法的交互式控制仅在 LoadedBehavior 设置为 Manual 时可用。 这些方法在媒体对象处于时钟模式时不可用。

请参阅控制 MediaElement(Play、Pause、Stop、Volume 和 Speed)了解独立模式的示例。

时钟模式

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

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

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

  • 通过设置 MediaTimeline 对象的 Source 属性、从时间线创建时钟并将时钟分配至媒体对象来加载媒体。 也可以在 Storyboard 中的 MediaTimelineMediaElement 作为目标时使用这种方法加载媒体。

要在时钟模式下控制媒体播放,必须使用 ClockController 控制方法。 ClockController 是从 MediaClockClockController 属性获取的。 如果尝试在时钟模式下使用 MediaElementMediaPlayer 对象的控制方法,将引发 InvalidOperationException

请参阅动画概述了解有关时钟和时间线的更多信息。

请参阅使用情节提要控制 MediaElement 了解时钟模式的示例。

MediaElement 类

将媒体添加到应用程序非常简单,就如同将 MediaElement 控件添加到该应用程序的用户界面 (UI) 以及向想要包含的媒体提供 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 对象的默认行为,由 LoadedBehaviorUnloadedBehavior 属性控制。

控制 MediaElement

LoadedBehaviorUnloadedBehavior 属性分别控制 IsLoadedtruefalseMediaElement 的行为。 属性设置的 MediaState 影响媒体播放行为。 例如,默认 LoadedBehaviorPlay,默认 UnloadedBehaviorClose。 这意味着,一旦加载 MediaElement 并且预滚完成,媒体开始播放。 一旦播放完毕,媒体就会关闭并且发布所有媒体资源。

LoadedBehaviorUnloadedBehavior 属性并不是控制媒体播放的唯一方法。 在时钟模式下,时钟可以控制 MediaElement 并且交互式控制方法在 LoadedBehaviorManual 时可以控制。 MediaElement 通过评估以下属性处理这种控制争用。

  1. UnloadedBehavior。 卸载媒体时就位。 这确保所有媒体资源都默认为已发布,即使是在 MediaClockMediaElement 关联时也是如此。

  2. MediaClock。 媒体具有 Clock 时就位。 如果媒体已卸载,只要 UnloadedBehaviorManualMediaClock 就会生效。 时钟模式下将始终覆盖 MediaElement 的已加载行为。

  3. LoadedBehavior。 加载媒体时就位。

  4. 交互式控制方法。 当 LoadedBehaviorManual 时就位。 可用的控制方法有 PlayPauseCloseStop

显示 MediaElement

要显示 MediaElement,必须有要显示的内容,并且在加载内容之前,ActualWidthActualHeight 属性将设置为零。 对于仅包含音频的内容,这些属性将始终为零。 对于视频内容,一旦引发 MediaOpened 事件,ActualWidthActualHeight 将报告已加载媒体的大小。 这意味着,只要媒体已加载,除非 WidthHeight 属性已设置,否则 MediaElement 不会占用用户界面 (UI) 的任何物理空间。

同时设置 WidthHeight 属性会导致媒体拉伸,以填充为 MediaElement 提供的区域。 要保留媒体的原始纵横比,WidthHeight 属性不应同时设置。 同时设置 WidthHeight 属性,会导致媒体以固定的元素大小展示,效果可能不理想。

要避免出现固定大小元素,Windows Presentation Foundation (WPF) 可以预滚媒体。 这是通过将 LoadedBehavior 设置为 PlayPause 来完成的。 在 Pause 状态下,媒体将预滚并展示第一个框架。 在 Play 状态下,媒体将预滚并开始播放。

MediaPlayer 类

其中,MediaElement 类是框架元素,MediaPlayer 类专为在 Drawing 对象中使用而设计。 当可以牺牲框架级别功能来获得性能优势或需要 Freezable 功能时使用 Drawing 对象。 MediaPlayer 可以利用这些功能,同时在应用程序中提供媒体内容。 类似 MediaElementMediaPlayer 可以在独立或时钟模式下使用,但不具备 MediaElement 对象的卸载和加载状态。 这将降低 MediaPlayer 的播放控件的复杂程度。

控制 MediaPlayer

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

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

  2. MediaClock。 媒体具有 Clock 时就位。

显示 MediaPlayer

从技术上讲,MediaPlayer 没有物理表示形式,因此无法显示。 但是,它可用于在 Drawing 中使用 VideoDrawing 类显示媒体。 以下示例演示使用 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 对象的详细信息,请参阅绘图对象概述

另请参阅