C# WPF 用MediaElement控件实现视频循环播放
在WPF里用MediaElement控件,实现一个循环播放单一视频的程序,同时可以控制视频的播放、暂停、停止。
一种方式,使用MediaElement.MediaEnded事件,在视频播放结束后,自动重新播放;
另一种方式,使用WPF定时器,在定时器事件里写入视频播放代码。
后者优点是可以控制循环时长,不必等到视频播放结束就可以开始下一次播放,比如:同时启动多个播放程序,使多个时长不同的视频同时播放,无限循环,如果采用第一种方式,累计多次自动播放后,视频内容就无法同步。
第一种方式:
XAML:
<MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="" VerticalAlignment="Top" Width=""/>
<Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="68,279,0,0" VerticalAlignment="Top" Width="" Click="btnPlay_Click"/>
<Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="170,279,0,0" VerticalAlignment="Top" Width="" Click="btnPause_Click"/>
<Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="295,279,0,0" VerticalAlignment="Top" Width="" Click="btnStop_Click"/>
C#:
// 窗口加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 绑定视频文件
mediaElement.Source = new Uri("D:/bird.mp4"); // 交互式控制
mediaElement.LoadedBehavior = MediaState.Manual; // 添加元素加载完成事件 -- 自动开始播放
mediaElement.Loaded += new RoutedEventHandler(media_Loaded); // 添加媒体播放结束事件 -- 重新播放
mediaElement.MediaEnded += new RoutedEventHandler(media_MediaEnded); // 添加元素卸载完成事件 -- 停止播放
mediaElement.Unloaded += new RoutedEventHandler(media_Unloaded);
} /*
元素事件
*/
private void media_Loaded(object sender, RoutedEventArgs e)
{
(sender as MediaElement).Play();
} private void media_MediaEnded(object sender, RoutedEventArgs e)
{
// MediaElement需要先停止播放才能再开始播放,
// 否则会停在最后一帧不动
(sender as MediaElement).Stop();
(sender as MediaElement).Play();
} private void media_Unloaded(object sender, RoutedEventArgs e)
{
(sender as MediaElement).Stop();
} /*
播放控制按钮的点击事件
*/
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
mediaElement.Play();
} private void btnPause_Click(object sender, RoutedEventArgs e)
{
mediaElement.Pause();
} private void btnStop_Click(object sender, RoutedEventArgs e)
{
mediaElement.Stop();
}
第二种方式:
注:使用DispatcherTimer,需要添加System.Windows.Threading命名空间。
XAML:
<MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="" Margin="19,10,0,0" VerticalAlignment="Top" Width="" LoadedBehavior ="Manual"/>
<Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="52,270,0,0" VerticalAlignment="Top" Width="" Click="btnPlay_Click"/>
<Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="163,270,0,0" VerticalAlignment="Top" Width="" Click="btnPause_Click"/>
<Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="266,270,0,0" VerticalAlignment="Top" Width="" Click="btnStop_Click"/>
C#:
DispatcherTimer timer = new DispatcherTimer(); // 定时器timer
int durTime = ; // 视频播放时长,也就是循环周期 // 窗口加载事件
private void Window_Loaded(object sender, RoutedEventArgs e)
{
mediaElement.Source = new Uri("D:/bird.mp4"); // 绑定视频文件 mediaElement.Play(); // 设置启动播放
timer.Interval = new TimeSpan(, , , durTime); // 设置定时器重复周期
timer.Tick += new EventHandler(timerEvent); // 设置定时器事件 timer.Start(); // 启动定时器
} // 定时器事件
public void timerEvent(object sender, EventArgs e)
{
// MediaElement需要先停止播放才能再开始播放,
// 否则会停在最后一帧不动
mediaElement.Stop();
mediaElement.Play();
} /*
播放控制按钮的点击事件
*/
private void btnPlay_Click(object sender, RoutedEventArgs e)
{
mediaElement.Play(); // 开始播放
timer.Start(); // 重新启动定时器
} private void btnPause_Click(object sender, RoutedEventArgs e)
{
mediaElement.Pause(); // 暂停当前播放
timer.Stop(); // 停止定时器
} private void btnStop_Click(object sender, RoutedEventArgs e)
{
mediaElement.Stop(); // 停止当前播放
timer.Stop(); // 停止定时器
}
项目源码下载链接:https://files.cnblogs.com/files/walker-cheng/WpfVideoCyclePlayer.zip
C# WPF 用MediaElement控件实现视频循环播放的更多相关文章
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- 示例:WPF中Slider控件封装的缓冲播放进度条控件
原文:示例:WPF中Slider控件封装的缓冲播放进度条控件 一.目的:模仿播放器播放进度条,支持缓冲任务功能 二.进度: 实现类似播放器中带缓存的播放样式(播放区域.缓冲区域.全部区域等样式) 实现 ...
- MFC控件实现视频“暂停” “播放”循环
问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...
- WPF中Ribbon控件的使用
这篇博客将分享如何在WPF程序中使用Ribbon控件.Ribbon可以很大的提高软件的便捷性. 上面截图使Outlook 2010的界面,在Home标签页中,将所属的Menu都平铺的布局,非常容易的可 ...
- WPF 调用WinForm控件
WPF可以使用WindowsFormsHost控件做为容器去显示WinForm控件,类似的用法网上到处都是,就是拖一个WindowsFormsHost控件winHost1到WPF页面上,让后设置win ...
- InteropBitmap指定内存,绑定WPF的Imag控件时刷新问题。
1.InteropBitmap指定内存,绑定WPF的Imag控件的Source属性 创建InteropBitmap的时候,像素的格式必须为PixelFormats.Bgr32, 如果不是的话在绑定到I ...
- 在WPF程序中将控件所呈现的内容保存成图像(转载)
在WPF程序中将控件所呈现的内容保存成图像 转自:http://www.cnblogs.com/TianFang/archive/2012/10/07/2714140.html 有的时候,我们需要将控 ...
- 在wpf中如何让MediaElement的视频循环播放
原文:在wpf中如何让MediaElement的视频循环播放 MediaElement原始的播放是只播放一遍:如何设置让MediaElement播放 的视频或者音频循环播放,解决如下: 修改Media ...
- 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
随机推荐
- EasyUI DataGrid 获得分页信息
var b = $('#SBDiv_1_DateGrid').datagrid('options'); console.info(b); 具体需要哪些字段,可以通过火狐debug,然后自己找需要的信息 ...
- 2017/2/5:oracle数据库的三大文件
oracle的三大文件: 一:控制文件:控制文件是一个小型的二进制文件,可以记录数据库的物理结构.包括: * 数据库名称 * 数据文件和日志文件的名称和位置 * 数据库创建的时 ...
- 695. Max Area of Island
static int wing=[]() { std::ios::sync_with_stdio(false); cin.tie(NULL); ; }(); class Solution { publ ...
- 2019.01.10 bzoj1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
传送门 蒟蒻真正意义上做的第一道动态点分治! 题意:给一棵最开始所有点都是黑点的树,支持把点的颜色变成从黑/白色变成白/黑色,问当前状态树上两个最远黑点的距离. 思路: 首先考虑不带修改一次点分治怎么 ...
- 2018.10.24 bzoj3195: [Jxoi2012]奇怪的道路(状压dp)
传送门 f[i][j][k]f[i][j][k]f[i][j][k]表示前iii个点连了jjj条边,第i−K+1i-K+1i−K+1~iii个点连边数的奇偶性为kkk时的方案数. 转移规定只能从后向前 ...
- (13)How to stay calm when you know you'll be stressed
https://www.ted.com/talks/daniel_levitin_how_to_stay_calm_when_you_know_you_ll_be_stressed/transcrip ...
- shell 常见面试
1.求100以内的质数 #!/bin/bash n= ;i<=n;i++)) do ;x<=i;x++)) do b=$(( $i%$x )) ]]; then a=$a+ fi done ...
- mybatis 时间区间比较
直接上代码,此时数据库使用的Date类型: <if test="minCreateTime != null and minCreateTime != ''"> < ...
- i2c_client的生成
网上很多文档都是介绍源码,包括i2c_client结构体的源码都有贴出,看上去似乎需要手动写该结构体,但实际上,i2c_client的生成是用如下方法. \arch\arm\mach-omap2/bo ...
- java调用执行cmd指令启动weblogic
这里的例子是启动weblogic import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...