在WPF MediaElement中展示视频的第一帧

18

我有一个WPF应用程序,其中使用MediaElement播放视频。 我不希望视频在加载时自动播放,因此将其LoadedBehavior设置为手动。

<MediaElement LoadedBehavior="Manual" 
              Source="foo.wmv" 
              MediaOpened="videoElement_MediaOpened" />

然而,我希望在加载时该元素展示视频的第一帧。有什么神奇的方法可以实现吗?

3个回答

27
你还需要其他的东西。
ScrubbingEnabled="True"

然后在加载时设置一个事件

Loaded="Video1_Loaded"

在Video1_Load方法中添加以下内容:

Video1.Play();
Video1.Pause();

只有在调用play方法之后,才会渲染任何视频内容。因此,即使您将位置设置为第一帧之后,也不会呈现任何数据。

我认为MediaElement.ScrubbingEnabled属性是关键。

  

获取或设置一个值,该值表示   当暂停时,MediaElement是否会更新   搜索操作的帧。这是一个依赖属性。

我尝试了没有使用ScrubbingEnabled的相同方法,但发现第一帧不会呈现。不确定这是否仅与我用于此的硬件有关。另一个需要记住的要点是,MediaElement的工作方式是,一旦调用了Play(),您可能不会确切地在第一帧上Pause(),因此您可能需要在调用Play()之前降低流的音量,并在调用Pause()之后重置。


1
谢谢 - 这个可行!我必须说,Play() Pause() 触发并不是让我感到完全舒适的方法。看到其他人也建议这样做,但我觉得这种方法有点“hacky”。但如果这是唯一的方法,我想我们只能接受它。ScrubbingEnabled 是一个很好的属性,但似乎与在启动时显示第一帧视频无关。 - stiank81
使用MediaOpened事件而不是Loaded对我有用,只要在事件处理程序中播放然后暂停。 - RandomEngy

9
您无需创建事件,可以参考以下内容。
<MediaElement Source="foo.wmv" 
              MediaOpened="videoElement_MediaOpened" 
              LoadedBehavior="Pause" ScrubbingEnabled="True" />

你不能使用play、stop等方法来控制MediaElement。因此,你必须将LoadedBehavior设置为manual。如果你将其设置为pause,那么你如何开始播放呢? - Alexander Zwitbaum
通过调用“播放”方法来响应与集成按钮无关的其他事件?@AlexanderZwitbaum - O. R. Mapper

2
我不能进行评论,所以这是我的回答: Scrubbing 指的是在 MediaElement 暂停时更新渲染图像。
//Todo: Set your source

//if not stated in the xmal, you can still set this here.
Player.LoadedBehavior = MediaState.Manual;

//Turn scrubbing on
Player.ScrubbingEnabled = true;

Player.Pause();

Player.Position = TimeSpan.FromTicks(1);

感谢您提供的清洗技巧!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接