VLC播放器


最近在做WPF項目,需要做個本地的離線播放器,基本網上常用的有兩種播放器,一種是 MediaElement方式的播放器,另一種就是Vlc的播放器,那么話不多說直接上代碼!

1.先將Vlc播放器下載到本地進行安裝,(官網地址:https://www.videolan.org/vlc/index.zh.html),注意下載是64位的,還是32位的,由於我的工程項目是x86的,所以我下的32位的

2.將安裝后的路徑(C:\Program Files (x86)\VideoLAN)下的VLC文件夾整體拷貝到項目的根目錄下(\bin\x86\Debug)

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>
WPF前台
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;
        }
    }
}
WPF后台

最后效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM