采用VLC解码器,能播放市面上几乎所有格式影片。
Models:SysInfo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MvvmPlayer.Models
{
public class SysInfo
{
public string Title { get; set; } //标题
public string MediaFile { get; set; } //媒体文件
public float MediaPosition { get; set; } //播放进度
public string MediaTime { get; set; } //播放时间
//public double MediaVolume { get; set; } //音量
//public bool IsMute { get; set; } //是否静音
}
}
ViewModels:VideoPlayerViewModel
using GalaSoft.MvvmLight; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Vlc.DotNet.Core; using Vlc.DotNet.Wpf; using MvvmPlayer.Models; using System.Windows.Media; using System.Windows.Input; using GalaSoft.MvvmLight.Command; using Microsoft.Win32; using Vlc.DotNet.Core.Medias; using System.Windows; using System.Windows.Controls; using System.Windows.Threading; namespace MvvmPlayer.ViewModels { public class VideoPlayerViewModel : ViewModelBase { #region 构造方法 public VideoPlayerViewModel() { if (!VlcContext.IsInitialized) InitEncoder(); _sysInfo = new SysInfo(); myVideo = new VlcControl();
this.PlayerWindowStyle = WindowStyle.ThreeDBorderWindow; this.PlayerWindowState = WindowState.Normal; this.GridVideoScaleY = 1; this.MyVideo.TimeChanged += myVideo_TimeChanged; //定义视频播放时间改变事件 this.MyVideo.PositionChanged += myVideo_PositionChanged; //定义播放位置改变事件 } #endregion #region 初始化事件 // 播放控件拖放事件 void gridVideo_Drop(object sender, DragEventArgs e) { //获取拖拽的文件 string fileName = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString(); this.MyVideo.Stop(); this.MyVideo.Media = new PathMedia(fileName); System.Threading.Thread.Sleep(1); this.MyVideo.Play(); } //播放控件拖放事件 void gridVideo_DragEnter(object sender, DragEventArgs e) { //仅支持文件的拖放 if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effects = DragDropEffects.Link; else e.Effects = DragDropEffects.None; } // 窗口关闭事件 private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { VlcContext.CloseAll(); //关闭解码器环境 } // 播放位置改变事件 private void myVideo_PositionChanged(VlcControl sender, VlcEventArgs<float> e) { if (myPositionChanging) //如果正在拖动进度条,则暂时不改变进度条的值 return; this.MediaPosition = e.Data; //改变进度条的值 } #region 进度条处理事件 // 进度条拖动事件 private bool myPositionChanging; private void sliderPosition_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) { myPositionChanging = true; //位置改变设置为true this.MediaPosition = (float)sliderPosition.Value; //媒体进度值等于进度条的值 this.MyVideo.PositionChanged -= myVideo_PositionChanged; //删除播放位置改变事件 } // 完成拖播放进度条 private void sliderPosition_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e) { this.MyVideo.Position = (float)sliderPosition.Value; //设置播放进度,等于进度条的值 this.MyVideo.PositionChanged += myVideo_PositionChanged; //添加播放位置改变事件 myPositionChanging = false; } // 进度条值改变 void sliderPosition_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { this.MediaPosition = (float)e.NewValue; //设置播放位置 } #endregion // 鼠标移动时,显示播放进度条 DispatcherTimer timer1 = null; void gridVideo_MouseMove(object sender, MouseEventArgs e) { if (timer1 == null) { timer1 = new DispatcherTimer(); } if (this.PlayerWindowState == WindowState.Maximized) //判断窗口是否为最大化 { SliderPositionVisibility = Visibility.Visible; //显示播放进度条 Mouse.OverrideCursor = null; //恢复鼠标显示 timer1.Interval = TimeSpan.FromSeconds(4); //鼠标4秒不动,自动隐藏 timer1.Tick += (s, e1) => { SliderPositionVisibility = Visthis.Title = "作者:腾飞大侠 邮箱:cbuduknui@163.com"; this.MediaTime = "作者:腾飞大侠 邮箱:cbuduknui@163.com";