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控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
随机推荐
- Tomcat优化详细1
在Tomcat和应用程序进行了压力测试后,如果您对应用程序的性能结果不太满意,就可以采取一些性能调整措施了,当然了前提是应用程序没有问题,我们这里只讲Tomcat的调整.由于Tomcat的运行依赖于J ...
- HTML5基础实例
<!DOCTYPE html> <!--声明HTML文档--> <html> <head> <title>我的网页</title> ...
- WPF禁止拖拽窗口到边缘自动最大化
近期有个需求,可以通过拖拽改变窗口大小,但是不允许窗口最大化.最小化.拖到边缘的时候也不能自动最大化. 要想禁止拖拽窗口到边缘自动最大化,只要改注册表即可,但是系统所有应用都会被禁止. 1.运行reg ...
- centos7 hive + 远程mysql 搭建笔记
1.require:java环境,本地可用的hadoop,远程可访问的mysql 2.拷贝hive文件(hive-2.2.1) 3.设置环境变量 export HIVE_HOME=/data/spar ...
- 7个鲜为人知却超实用的PHP函数--转(柒捌玖零)
PHP有许多内置函数,其中大多数函数都被程序员广泛使用.但也有一些函数隐藏在角落,本文将向大家介绍7个鲜为人知,但用处非常大的函数. 没用过的程序员不妨过来看看. 1.highlight_string ...
- Linux---CentOS 定时运行脚本配置
很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如使用七牛的工具上传,如果同步文件里面有新增加一个文件,这个时候我们可以提供定时脚本去完成我们需要的同步命令(七牛的qrsbox工具是自动会 ...
- cacti+CentOS6.5
系统版本:CentOS6.5 软件版本:cacti-0.88f 需要预安装的软件有以下几种,可以通过yum安装全部 yum -y install net-snmp* yum -y install op ...
- MODULE_DEVICE_TABLE 的作用
pci_device_id,PCI设备类型的标识符.在include/linux/mod_devicetable.h头文件中定义.struct pci_device_id { __u32 ...
- WordPaster-UEditor1.x整合教程
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- 20145232 韩文浩 《Java程序设计》第5周学习总结
教材学习内容总结 处理异常 教材中使用一个简单的程序,用户连续输入整数最后输入0结束后显示输入数的平均值. 但有时,用户会没有按常规出牌输入不正确的信息,例如"30"输成" ...