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控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...
随机推荐
- firefox 之 event兼容写法
event 在 IE 和 FF(Firefox) 中是不兼容的,IE 中可以直接使用 event 对象,而 FF 中则不可以,解决方法之一如下: var event = window.event || ...
- 用php把access数据库导入到mysql
<?php header("content-Type: text/html; charset=utf-8"); /// ///把access数据库转换成mysql的SQL语句 ...
- OPNET仿真软件资料合集
1. OPEN中国代理商业 http://www.credit-top.com/page/Default.asp?pageID=105
- Mvvm Light 无法添加MvvmView(Win81)的问题
After I create a MvvmLight(Win81) project, I want add a new view , but there is only MvvmView(Win8), ...
- liunx基础命令
linux的简单介绍 linux是一款免费使用和自由传播的内似于unix的操作系统软件,是一个基于POSI和unix的多用户,多任务,支持多线程和多CPU的一种操作系统.主要用于服务器,特别是网络服务 ...
- acitvemq的jvm监控
在conf/activemq.xml启用jmx监控 即在broker后面添加useJmx="true"配置参数 <managementContext> <mana ...
- 实战fortran77基础语法2
由于大量的接触fortran77,先学习fortran77吧 1.fortran不区分大小写,fortran77一般全部大写,感觉没必要,不好读,还是用大小写混合着写吧.后缀 .for 为固定格式的代 ...
- svn更新的时候出现ERROR:Previous operation has not finished,run "clean up" if it wa interrupted;进行clean up命令也报错
报错的截图: 然后进行了clean up命令,依旧报错了: 这种情况就有两种方法去解决了,自己可以根据自己的情况选择,哪种方便选择哪种呗! 方法一: 备份自己修改的文件,删除之前download的文件 ...
- php 微信登录 公众号 获取用户信息 微信网页授权
php 微信登录 公众号 获取用户信息 微信网页授权 先自己建立两个文件: index.php 和 getUserInfo.php index.php <?php //scope=snsap ...
- nginx搭建简单的图片服务器
传统项目一般实现图片上传的话,都会在tomcat下面建立一个图片文件夹,上传成功后,用户可以直接访问, http://ip:port/project/images/xxx.jpg; 这样在用户量少的时 ...