抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

现状

在网上搜了一下相关教程,发现全部都是在视频播放完毕之后手动把进度设置为0来实现循环播放

但是这样做的后果是进度条跳跃时会出现轻度白屏和卡顿,如果视频本就是首尾相连的话,则会更明显

我的做法

在查看了微软官方文档之后,发现微软已经为我们提供了解决方案

首先创建一个 MediaElement 播放器,设置视频画面自动拉伸,加载行为改成手动

1
2
3
<Grid>
<MediaElement x:Name="MediaPlayer" Stretch="Fill" LoadedBehavior="Manual"/>
</Grid>

引入命名空间

1
2
using System.Windows.Media;
using System.Windows.Media.Animation;

为播放器创建时钟

1
2
3
4
5
6
7
8
9
10
11
12
//以绝对路径的方式加载资源,path为地址,并创建时间线
MediaTimeline mTimeLine = new MediaTimeline(new Uri(path, UriKind.Absolute));

//设置时间线的重复方式为循环播放
mTimeLine.RepeatBehavior = RepeatBehavior.Forever;

//用这个时间线创建一个时钟
MediaClock mClock = mTimeLine.CreateClock();

//将时钟应用到媒体播放器
//注意 "MediaPlayer" 是我的 MediaElement 的名字
this.MediaPlayer.Clock = mClock;

此时视频会自动开始播放,并且无法使用MediaElement的方法来控制视频行为,必须使用上面创建的时钟来控制

1
2
3
4
5
6
7
8
//控制时钟暂停
mClock.Controller.Pause();

//控制时钟继续播放
mClock.Controller.Resume();

//控制时钟停止播放
mClock.Controller.Stop();

附:Controller完整函数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//
// 摘要:
// 获取或设置目标 System.Windows.Media.Animation.Clock 的交互速度.
//
// 返回结果:
// 一个大于零的有限值,描述目标时钟的交互速度. 此值是时钟的 System.Windows.Media.Animation.Timeline 的 System.Windows.Media.Animation.Timeline.SpeedRatio
// 值的几倍. 例如,如果时间线的 System.Windows.Media.Animation.Timeline.SpeedRatio 为 0.5 且 System.Windows.Media.Animation.ClockController
// 对象的 System.Windows.Media.Animation.ClockController.SpeedRatio 为 3.0,则时间线以正常速度
// (0.5 * 3.0) 的 1.5 倍移动. 默认值为 1.0.
public double SpeedRatio { get; set; }

//
// 摘要:
// 设置目标 System.Windows.Media.Animation.ClockController.Clock,以在下一时钟周期开始.
public void Begin();

//
// 摘要:
// 停止处理目标 System.Windows.Media.Animation.Clock.
public void Pause();

//
// 摘要:
// 删除 System.Windows.Media.Animation.Clock 与此相关 System.Windows.Media.Animation.ClockController
// 从它进行动画处理的属性. 时钟和及其子时钟将不会再影响这些属性.
public void Remove();

//
// 摘要:
// 启用之前已暂停的 System.Windows.Media.Animation.Clock,以便继续处理.
public void Resume();

//
// 摘要:
// 在下一个计时周期开始时,根据指定的量查找目标 System.Windows.Media.Animation.ClockController.Clock.
// 如果目标时钟已停止,则查找会使它再次处于活动状态.
//
// 参数:
// offset:
// 查找偏移量,以目标时钟的时间为单位. 此偏移量相对于时钟的 System.Windows.Media.Animation.TimeSeekOrigin.BeginTime
// 或 System.Windows.Media.Animation.TimeSeekOrigin.Duration,具体取决于 origin 的值.
//
// origin:
// 一个值,指示指定的偏移量是否相对于目标时钟的 System.Windows.Media.Animation.TimeSeekOrigin.BeginTime
// 或 System.Windows.Media.Animation.TimeSeekOrigin.Duration.
public void Seek(TimeSpan offset, TimeSeekOrigin origin);

//
// 摘要:
// 查找目标 System.Windows.Media.Animation.Clock 立即指定的量. 如果目标时钟已停止,则查找会使它再次处于活动状态.
//
// 参数:
// offset:
// 查找偏移量,以目标时钟的时间为单位. 此偏移量相对于时钟的 System.Windows.Media.Animation.TimeSeekOrigin.BeginTime
// 或 System.Windows.Media.Animation.TimeSeekOrigin.Duration,具体取决于 origin 的值.
//
// origin:
// 一个值,指示指定的偏移量是否相对于目标时钟的 System.Windows.Media.Animation.TimeSeekOrigin.BeginTime
// 或 System.Windows.Media.Animation.TimeSeekOrigin.Duration.
public void SeekAlignedToLastTick(TimeSpan offset, TimeSeekOrigin origin);

//
// 摘要:
// 将目标 System.Windows.Media.Animation.Clock 的当前时间向前调至其活动周期的结束时间.
public void SkipToFill();

//
// 摘要:
// 停止目标 System.Windows.Media.Animation.Clock.
public void Stop();

评论