MediaElement 的两种模式
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 的两种模式的更多相关文章
- Windows2003 IIS6.0支持32位和64位两种模式的设置方法
IIS 6.0 可支持 32 位和 64 位两种模式.但是,IIS 6.0 不支持在 64 位版本的 Windows 上同时运行这两种模式.ASP.NET 1.1 只在 32 位模式下运行.而 ASP ...
- 【转】Reactor与Proactor两种模式区别
转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...
- ACE_linux:Reactor与Proactor两种模式的区别
一.概念: Reactor与Proactor两种模式的区别.这里我们只关注read操作,因为write操作也是差不多的.下面是Reactor的做法: 某个事件处理器宣称它对某个socket上的读事件很 ...
- JSP中两种模式的总结
运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...
- Doctype 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义?
Doctype:(Document Type)文档类型,它位于文档中最前面的位置,处于标签之前.如果你想制作符合标准的页面,一个必不可少的关键组成部分就是DOCTYPE的声明.确定了正确的Doctyp ...
- Android Studio的两种模式及签名配置
我们使用Android Studio 运行我们的app,无非两种模式:debug和release模式. debug模式 debug模式使用一个默认的debug.keystore进行签名. 这个默认签名 ...
- vue-router的两种模式的区别
众所周知,vue-router有两种模式,hash模式和history模式,这里来谈谈两者的区别. ### hash模式 hash模式背后的原理是`onhashchange`事件,可以在`window ...
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...
- 【Spark篇】---SparkStreaming+Kafka的两种模式receiver模式和Direct模式
一.前述 SparkStreamin是流式问题的解决的代表,一般结合kafka使用,所以本文着重讲解sparkStreaming+kafka两种模式. 二.具体 1.Receiver模式 原理图 ...
随机推荐
- Windows Server 2003安装方法
1. 设置BIOS,从光驱引导启动.光盘放入光驱,自动读盘,选择第一项“安装Windows Server 2003,Enterprise Bdition”: 2. 弹出加载安装文件界面. 3. 出现安 ...
- 记录一次Quartz2D学习(三)
在(二)内,讲到了几何图形的绘制,这次就讲文本与图片的绘制 3 图片与文本 3.1 文本绘制 - (void)drawRect:(CGRect)rect { NSString * str = @&qu ...
- Unity、c#中的拓展方法讲解
很早以前看过这个东西,但是没有真正的用到过,希望之后会用到上面的方法, 大概的意思是这样的c#中尤其在用Unity的时候,已有的框架提供给我们一些固定的方法,但是有时我们想对这些方法进行修改, 这时我 ...
- 吐槽CodeDom
用着.NET Framework,发现了CodeDom的先天性缺陷,心里百般难受. 不知道 CodeDom 是什么的请看这里 CodeDom_百度百科 这里有CodeDom非常全的中文教程 CodeD ...
- centos本地yum源安装
1.为DVD或U盘创建一个用于挂载的目录 [root@localhost ~]# mkdir /media/CentOS/ 2.查看DVD或U盘所在的路径 [root@localhost ~]# fd ...
- ERROR: Unable to globalize '/usr/local/NONE/etc/php-fpm.d/*.conf' 问题的解决
今天继续作大死,趟php7的配置的坑. 照例,安装了昨天的各种扩展之后,解压php7的压缩文件到 /usr/local/. 然后开始配置config的扩展: ./configure --prefix= ...
- 【原】移动web滑屏框架分享
本月26号参加webrebuild深圳站,会上听了彪叔的对初心的讲解,“工匠精神”这个词又一次被提出,也再次引起了我对它的思考.专注一个项目并把它做得好,很好,更好...现实工作中,忙忙碌碌,抱着完成 ...
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- Linux 共享内存详解一
共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...
- js 页面刷新location.reload和location.replace的区别小结
reload 方法,该方法强迫浏览器刷新当前页面. 语法: location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前 ...