MediaElement 的两种模式

时间:2022-09-24 10:20:57

    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

MediaElement 的两种模式的更多相关文章

  1. Windows2003 IIS6.0支持32位和64位两种模式的设置方法

    IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...

  2. 【转】Reactor与Proactor两种模式区别

    转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...

  3. ACE_linux:Reactor与Proactor两种模式的区别

    一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...

  4. JSP中两种模式的总结

    运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...

  5. Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?

    Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...

  6. Android Studio的两种模式及签名配置

    我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式. debug模式 debug模式使用一个默认的debug.keystore进行签名. 这个默认签名 ...

  7. vue-router的两种模式的区别

    众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. ### hash模式 hash模式背后的原理是`onhashchange`事件,可以在`window ...

  8. Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?

    Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...

  9. 【Spark篇】---SparkStreaming&plus;Kafka的两种模式receiver模式和Direct模式

    一.前述 SparkStreamin是流式问题的解决的代表,一般结合kafka使用,所以本文着重讲解sparkStreaming+kafka两种模式. 二.具体 1.Receiver模式    原理图 ...

随机推荐

  1. python爬虫学习&lpar;6&rpar; —— 神器 Requests

    Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 H ...

  2. Python实战项目网络爬虫 之 爬取小说吧小说正文

    本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 ...

  3. nginx中相关配置

    #nginx 开启目录浏览 location / { root /data/www/file //指定实际目录绝对路径: autoindex on; //开启目录浏览功能: autoindex_exa ...

  4. iOS开发小技巧--纯代码自定义cell

    纯代码自定义cell 自定义cell的步骤(每个cell的高度不一样,每个cell里面显示的内容也不一样) 1.新建一个继承自UITableViewCell的子类 2.在initWithStyle:方 ...

  5. 计数方法,博弈论(扫描线,树形SG):HDU 5299 Circles Game

    There are n circles on a infinitely large table.With every two circle, either one contains another o ...

  6. 数据库分片(Database Sharding&rpar;详解

    本文由云+社区发表 作者:腾讯云数据库 Introduction 导言 任何看到显著增长的应用程序或网站,最终都需要进行扩展,以适应流量的增加.以确保数据安全性和完整性的方式进行扩展,对于数据驱动的应 ...

  7. JDBC——连接数据库

    JDBC的基本介绍 1.概述:jdbc是使用Java访问各种数据库的一种技术 (1)jdbc工作原理 2.jdbc核心Java类(API) (1)DriverManager类 作用:管理各种数据库的驱 ...

  8. 稀疏矩阵 part 2

    ▶ 各种稀疏矩阵数据结构之间的转化 ● MAT ←→ CSR CSR * MATToCSR(const MAT *in) // MAT 转 CSR { checkNULL(in); CSR * out ...

  9. Android&amp&semi;Java面试题大全—金九银十面试必备

    声明本文由作者:Man不经心授权转载,转载请联系原文作者原文链接:https://www.jianshu.com/p/375ad14096b3, 类加载过程 Java 中类加载分为 3 个步骤:加载. ...

  10. spark操作Kudu之读 - 使用DataFrame API

    虽然我们可以通过上面显示的KuduContext执行大量操作,但我们还可以直接从默认数据源本身调用读/写API. 要设置读取,我们需要为Kudu表指定选项,命名我们要读取的表以及为表提供服务的Kudu ...