多媒体概述

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

本主题包括下列各节。

  • 媒体 API
  • 媒体播放模式
  • MediaElement 类
  • MediaPlayer 类
  • 相关主题

媒体 API

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

MediaElement 是一个 UIElement,它受 布局系统 支持并可用作许多控件的内容。 它也可用在Extensible Application Markup Language (XAML) 以及代码中。另一方面,MediaPlayer 用于 Drawing 对象,因而缺少对布局的支持。 只能使用 VideoDrawing 或通过直接与 DrawingContext 进行交互来呈现使用 MediaPlayer 加载的媒体。 不能在 XAML 中使用 MediaPlayer

有关绘图对象和绘图上下文的更多信息,请参见 Drawing 对象概述

注意注意

在将媒体与应用程序一起分发时,不能将媒体文件用作项目资源。在项目文件中,必须将媒体类型改设为 Content,并将 CopyToOutputDirectory 设置为 PreserveNewest 或 Always。

媒体播放模式

注意注意

MediaElementMediaPlayer 具有类似的成员。本部分中的链接指的是 MediaElement 类成员。除非明确说明,否则链接到 MediaElement 类中的成员也可在 MediaPlayer 类中找到。

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

独立模式

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

  • 可直接指定媒体的 Uri

  • 可直接控制媒体播放。

  • 可修改媒体的 PositionSpeedRatio 属性。

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

若要在独立模式下控制媒体播放,可使用媒体对象的控制方法。 提供了下列控制方法:PlayPauseCloseStop。 对于 MediaElement,仅当将 LoadedBehavior 设置为 Manual 时,使用这些方法的交互式控件才可用。 当媒体对象处于时钟模式时,这些方法将不可用。

有关独立模式的示例,请参见如何:控制 MediaElement(播放、暂停、停止、音量和速度)

时钟模式

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

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

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

  • 可通过以下方法加载媒体:设置 MediaTimeline 对象的 Source 属性,从时间线创建时钟,并将时钟分配给媒体对象。 当位于 Storyboard 中的 MediaTimeline 针对 MediaElement 时,也可用这种方法加载媒体。

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

有关时钟和时间线的更多信息,请参见动画概述

有关时钟模式的示例,请参见如何:使用演示图板控制 MediaElement

MediaElement 类

向应用程序添加媒体的操作十分简单,只需向应用程序的user interface (UI) 添加 MediaElement 控件,并为要包含的媒体提供 Uri。 Windows Presentation Foundation (WPF) 中支持 Microsoft Windows Media Player 10 所支持的所有媒体类型。下面的示例演示 MediaElement 在Extensible Application Markup Language (XAML) 中的简单用法。

<!-- This page shows a simple usage of MediaElement -->
<Page x:Class="MediaElementExample.SimpleUsage"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="SimpleUsage"
    >
  <StackPanel Margin="20">
    <MediaElement Source="media/numbers-aud.wmv" />
  </StackPanel>
</Page>

在此示例中,媒体在加载后即会自动播放。 播放完后,就会关闭媒体,并且会释放所有媒体资源(包括视频内存)。 此行为是 MediaElement 对象的默认行为,由 LoadedBehaviorUnloadedBehavior 属性控制。

控制 MediaElement

IsLoaded 为 true 或 false 时,可分别使用 LoadedBehaviorUnloadedBehavior 属性控制 MediaElement 的行为。 设置 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 后,会报告已加载媒体的大小。 这意味着在加载媒体之前,MediaElement 不会占用user interface (UI) 中的任何物理空间,除非设置了 WidthHeight 属性。

如果设置 WidthHeight 属性,则会导致拉伸媒体来填充为 MediaElement 提供的区域。 若要保持媒体的原始纵横比,应设置 WidthHeight 属性,但不能同时设置这两者。 如果同时设置 WidthHeight 属性,则会使媒体以固定元素大小显示,可能无法达到预期效果。

为避免元素大小固定,Windows Presentation Foundation (WPF) 可以预播放媒体。 为此,需要将 LoadedBehavior 设置为 PlayPause。 在 Pause 状态下,媒体将预先缓冲,并将显示第一帧。 在 Play 状态下,媒体将预先缓冲,然后再开始播放。

MediaPlayer 类

MediaElement 类为框架元素时,MediaPlayer 类设计为在 Drawing 对象中使用。 当可以牺牲框架级别功能而提高性能或需要 Freezable 功能时将使用图形对象。 通过 MediaPlayer,可以在应用程序中提供媒体内容的同时利用这些功能。 与 MediaElement 类似,MediaPlayer 可在独立模式或时钟模式下使用,但不具有 MediaElement 对象的卸载和加载状态。 这会降低 MediaPlayer 的播放控制的复杂程度。

控制 MediaPlayer

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

  1. 交互式控制方法。 在处于独立模式(null Clock 属性)时采用。

  2. 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 对象的更多信息,请参见 Drawing 对象概述

请参见

参考

DrawingGroup

概念

布局系统

其他资源

音频和视频帮助主题