最近在做WPF项目,需要做个本地的离线播放器,基本网上常用的有两种播放器,一种是 MediaElement方式的播放器,另一种就是Vlc的播放器,那么话不多说直接上代码!
1.先将Vlc播放器下载到本地进行安装,(官网地址:https://www.videolan.org/vlc/index.zh.html),注意下载是64位的,还是32位的,由于我的工程项目是x86的,所以我下的32位的
2.将安装后的路径(C:Program Files (x86)VideoLAN)下的VLC文件夹整体拷贝到项目的根目录下(inx86Debug)
3.然后在项目的NuGet管理包中安装需要用到的三个包:Vlc.DotNet.Core,Vlc.DotNet.Core.Interops,Vlc.DotNet.Wpf
4,介绍一下常用的API和Event
//暂停 this.vlcControl.SourceProvider.MediaPlayer.Pause();
//播放 this.vlcControl.SourceProvider.MediaPlayer.Play();
//音量控制 this.vlcControl.SourceProvider.MediaPlayer.Audio.Volume = 100;
//倍数控制 this.vlcControl.SourceProvider.MediaPlayer.Rate = 1.5f;
//视频长度 单位:ms var len = this.vlcControl.SourceProvider.MediaPlayer.Length;
//全屏 this.vlcControl.SourceProvider.MediaPlayer.Video.FullScreen = true;
//进度变化事件 this.vlcControl.SourceProvider.MediaPlayer.PositionChanged += MediaPlayer_PositionChanged;
5.上实例环节,鼓掌
<Window x:Class="_2gd_read.Offline.showVideo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:_2gd_read.video" xmlns:hc="https://handyorg.github.io/handycontrol" mc:Ignorable="d" xmlns:wpf="clr-namespace:Vlc.DotNet.Wpf;assembly=Vlc.DotNet.Wpf" Title="video" Height="450" Width="800" Loaded="Window_Loaded"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="60" /> </Grid.RowDefinitions> <wpf:VlcControl x:Name="myControl"/> <Grid Grid.Row="1"> <Grid.RowDefinitions> <RowDefinition Height="20"/> <RowDefinition Height="40" /> </Grid.RowDefinitions> <Slider x:Name="media_slider" Minimum="0" Maximum="0" Value="0" IsSnapToTickEnabled="True" IsMoveToPointEnabled="True" ValueChanged="media_slider_ValueChanged" VerticalAlignment="Center"/> <StackPanel Orientation="Horizontal" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Center"> <Button x:Name="ButtonForward" Click="ButtonForward_Click" Content="快进" Width="100" Height="28" Margin="5" /> <Button x:Name="ButtonStop" Click="ButtonStop_Click" Content="停止" Width="100" Height="28" Margin="5" /> <Button x:Name="ButtonBack" Click="ButtonBack_Click" Content="快退" Width="100" Height="28" Margin="5" /> <ContentControl x:Name="ControlContainer"/> </StackPanel> </Grid> </Grid> </Window>
using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Windows.Threading; using Vlc.DotNet.Core; using Vlc.DotNet.Wpf; namespace _2gd_read.Offline { /// <summary> /// showImage.xaml 的交互逻辑 /// </summary> public partial class showVideo : Window { public readonly string url = ""; public readonly string name = ""; public showVideo(string surl) { InitializeComponent(); string path = AppDomain.CurrentDomain.BaseDirectory + "sourse\book\bookdata\downloadresources"; name = surl.Substring(surl.LastIndexOf('/') + 1); string wjname = surl.Substring(0, surl.LastIndexOf('/')); wjname = wjname.Substring(wjname.LastIndexOf('/') + 1); url = path + "\" + wjname + "\" + name; } private void Window_Loaded(object sender, RoutedEventArgs e) { this.VedioSource = new Uri(url); } private void ButtonStop_Click(object sender, RoutedEventArgs e) { if (ButtonStop.Content.ToString() == "停止") { myControl.SourceProvider.MediaPlayer.Pause(); ButtonStop.Content = "播放"; } else if (ButtonStop.Content.ToString() == "播放") { myControl.SourceProvider.MediaPlayer.Play(); ButtonStop.Content = "停止"; } } // 快进 private void ButtonForward_Click(object sender, RoutedEventArgs e) { if (myControl.SourceProvider.MediaPlayer == null) return; if (myControl.SourceProvider.MediaPlayer.IsPlaying()) myControl.SourceProvider.MediaPlayer.Pause(); float cur_time = myControl.SourceProvider.MediaPlayer.Position; cur_time += 0.020f; if (cur_time >= 1) { return; } myControl.SourceProvider.MediaPlayer.Position = cur_time; myControl.SourceProvider.MediaPlayer.Play(); } // 快退 private void ButtonBack_Click(object sender, RoutedEventArgs e) { if (myControl.SourceProvider.MediaPlayer == null) return; if (myControl.SourceProvider.MediaPlayer.IsPlaying()) myControl.SourceProvider.MediaPlayer.Pause(); float cur_time = myControl.SourceProvider.MediaPlayer.Position; cur_time -= 0.020f; if (cur_time <= 0) { return; } myControl.SourceProvider.MediaPlayer.Position = cur_time; myControl.SourceProvider.MediaPlayer.Play(); } //当前播放的路径 public Uri VedioSource { get { return (Uri)GetValue(VedioSourceProperty); } set { SetValue(VedioSourceProperty, value); } } public static readonly DependencyProperty VedioSourceProperty = DependencyProperty.Register("VedioSource", typeof(Uri), typeof(showVideo), new PropertyMetadata(default(Uri), (d, e) => { showVideo control = d as showVideo; if (control == null) return; Uri config = e.NewValue as Uri; control.InitVlc(); control.myControl.SourceProvider.MediaPlayer.Play(config); //control.toggle_play.IsChecked = false; })); //设置当前显示时间 public TimeSpan Time { get { return (TimeSpan)GetValue(TimeProperty); } set { SetValue(TimeProperty, value); } } public static readonly DependencyProperty TimeProperty = DependencyProperty.Register("Time", typeof(TimeSpan), typeof(showVideo), new PropertyMetadata(default(TimeSpan), async (d, e) => { showVideo control = d as showVideo; if (control == null) return; TimeSpan config = (TimeSpan)e.NewValue; await Task.Run(() => control.myControl.SourceProvider.MediaPlayer.Time = (long)config.TotalMilliseconds); })); private async void media_slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { long value = (long)this.media_slider.Value; await Task.Run(() => this.myControl.SourceProvider.MediaPlayer.Time = value); } private void PreviewSliderHorizontal_PreviewMouseUp(object sender, MouseButtonEventArgs e) { // myControl.SourceProvider.MediaPlayer.Position = float.Parse(PreviewSliderHorizontal.Value.ToString()); } private void slider_sound_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { this.RefreshAudio(); } public void RefreshAudio() { if (this.myControl?.SourceProvider?.MediaPlayer?.Audio == null) return; //this.myControl.SourceProvider.MediaPlayer.Audio.Volume = (int)this.slider_sound.Value; } //全屏显示 private void FButton_Click_Full(object sender, RoutedEventArgs e) { this.myControl.SourceProvider.MediaPlayer.Video.FullScreen = true; } //当前进度事件 private void MediaPlayer_PositionChanged(object sender, VlcMediaPlayerPositionChangedEventArgs e) { this.RefreshSlider(); } //刷新当前进度 public void RefreshSlider() { this.Dispatcher.Invoke(() => { this.media_slider.ValueChanged -= this.media_slider_ValueChanged; this.media_slider.Value = this.myControl.SourceProvider.MediaPlayer == null ? 0 : this.myControl.SourceProvider.MediaPlayer.Time; this.media_slider.ValueChanged += this.media_slider_ValueChanged; }); } //进度条长度事件 private void MediaPlayer_LengthChanged(object sender, VlcMediaPlayerLengthChangedEventArgs e) { this.InitSlider(); } //初始化播放进度条 public void InitSlider() { if (this.myControl?.SourceProvider?.MediaPlayer == null) return; this.Dispatcher.Invoke(() => { this.media_slider.Maximum = this.myControl.SourceProvider.MediaPlayer.Length; }); } //初始化 public void InitVlc() { if (this.myControl?.SourceProvider?.MediaPlayer != null) { this.myControl.SourceProvider.MediaPlayer.PositionChanged -= MediaPlayer_PositionChanged; this.myControl.SourceProvider.MediaPlayer.LengthChanged -= MediaPlayer_LengthChanged; } //this.myControl = new VlcControl(); //this.ControlContainer.Content = this.myControl; var currentDirectory = AppDomain.CurrentDomain.BaseDirectory + "VLC"; var libDirectory = new DirectoryInfo(currentDirectory); this.myControl.SourceProvider.CreatePlayer(libDirectory); //this.vlccontrol.SourceProvider.MediaPlayer.Video.IsMouseInputEnabled = false; //this.vlccontrol.SourceProvider.MediaPlayer.Video.IsKeyInputEnabled = false; this.myControl.SourceProvider.MediaPlayer.PositionChanged += MediaPlayer_PositionChanged; this.myControl.SourceProvider.MediaPlayer.LengthChanged += MediaPlayer_LengthChanged; } } }
最后效果: