MVVM模式基于开源VLC解码器WPF万能视频播放器

该博客介绍了如何利用MVVM模式和VLC开源解码器,在WPF平台上创建一个能播放各种视频格式的播放器。通过SysInfo.cs模型进行系统信息交互。
摘要由CSDN通过智能技术生成

采用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.Title = "作者:腾飞大侠 邮箱:cbuduknui@163.com";
            this.MediaTime = "作者:腾飞大侠 邮箱:cbuduknui@163.com";
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 = Vis
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值