栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

WPF 自己做的视频播放器控件记录一下

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

WPF  自己做的视频播放器控件记录一下

WPF 自己做的视频播放器控件记录一下

最近公司要做一个播放视频的业务,花了点事件做了个控件,记录一下方便以后使用

效果图


视频控件页面代码 PlayMediaControl1.xaml.cs

    
        
        
        
        
        
        
        
        
        
        
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
        
        
        
            
                
                
                    
                        
                    
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
            
                
                    
                        
                        
                        
                    
                    
                    
                    
                        
                            
                        
                    
                    
                        
                            
                        
                        
                            
                        
                        
                            
                        
                    
                
            
            
                
                    
                    
                    
                
                
                    
                    
                    
                
                
                    
                    
                
                
                    
                
                
                    
                
            
        
        
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
            
                
            
            
                
                    
                    
                
                
                    
                    
                
                
                    
                    
                
            
        
        
            
                
                    
                        
                        
                        
                    
                    
                    
                    
                        
                            
                        
                    
                    
                        
                            
                        
                        
                            
                        
                        
                            
                        
                    
                
            
            
                
                    
                    
                    
                
                
                    
                    
                    
                
                
                    
                    
                
                
                    
                
                
                    
                
            
        
        
    
    
    
    
        
            
            
            
        
        
        


        
            
                
                
                
                
                
                
                
            

            

            00:00

            

            00:00

            

            

            

        
    


视频控件代码 PlayMediaControl1.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
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;

namespace System.Content.ProductReview
{
    public enum windowType
    {
        min,
        max
    }

    /// 
    /// PlayMediaControl1.xaml 的交互逻辑
    /// 
    public partial class PlayMediaControl1 : UserControl
    {
        
        Timer timer;//时间迭代器
        Action action;

        #region 属性
        public bool isplaying
        {
            get ; 
            set;
        }

        /// 
        /// 视频默认开始位置
        /// 
        private  TimeSpan position;
        public TimeSpan Position
        {
            get { return position; }
            set
            {
                position = value;
                try
                {
                    mediaElement.Position = position;
                }
                catch (Exception)
                {
                }
                
            }
        }

        /// 
        /// 大小模式
        /// 
        private windowType windowType = windowType.min;
        public windowType WindowType
        {
            get { return windowType; }
            set
            {
                windowType = value;
                if (value==windowType.max)
                {
                    windowMaxMin.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_tomin.png"));
                    windowMaxMin.Tag = "max";
                }
            }
        }


        /// 
        /// 视频地址
        /// 
        private String urlPath;
        public String UrlPath
        {
            get { return urlPath; }
            set { urlPath = value;
                //设置视频路径
                Console.WriteLine("设置视频路径" + urlPath);
                mediaElement.Source = new Uri(urlPath);
            }
        }

        /// 
        /// 视频音量
        /// 
        public double MediaVoice
        {
            get { return mediaElement.Volume; }
            set { mediaElement.Volume = value; }
        }
        #endregion

        public PlayMediaControl1()
        {
            InitializeComponent();
            this.DataContext = this;
            action = new Action(() =>
            {

                mediaSlider.Value = mediaElement.Position.TotalSeconds;
                newTime.Text = mediaElement.Position.Minutes.ToString("00") + ":" + mediaElement.Position.Seconds.ToString("00");

            });
        }

        #region 事件

        /// 
        /// 关闭按钮
        /// 
        /// 
        /// 
        private void MClose_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mediaSlider.Value = mediaElement.Position.TotalSeconds;
            newTime.Text = mediaElement.Position.Minutes.ToString("00") + ":" + mediaElement.Position.Seconds.ToString("00");
        }
        /// 
        /// 点击播放暂停
        /// 
        /// 
        /// 
        private void Play_pause_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Image image = (Image)sender;
            if (image.Tag.Equals("pause"))//--》播放
            {
                mediaElement.Play();
                showPlayView();
            }
            else//-->暂停
            {
                mediaElement.Pause();
                showPauseView();
            }
        }
        /// 
        /// 视频进度条发送变化
        /// 
        /// 
        /// 
        private void MediaSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
        {
            mediaElement.Position = TimeSpan.FromSeconds(mediaSlider.Value);
            
        }


        /// 
        /// 当声音进度条发现改变
        /// 
        /// 
        /// 
        private void Voice_Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
        {
            
            mediaElement.Volume = voice_Slider.Value;
        }
        
        /// 
        /// 视频加载完成
        /// 
        /// 
        /// 
        private void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
        {
            try
            {
                Console.WriteLine("视频加载完成");
                mediaSlider.Maximum = mediaElement.NaturalDuration.TimeSpan.TotalSeconds;
                allTime.Text = mediaElement.NaturalDuration.TimeSpan.Minutes.ToString("00")+":"+ mediaElement.NaturalDuration.TimeSpan.Seconds.ToString("00");
                if (Position!=null)
                {
                    try
                    {
                        mediaElement.Position = position;
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            catch (Exception)
            {
            }
        }
        /// 
        /// 是否是静音
        /// 
        /// 
        /// 
        private void Voice_but_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (mediaElement.IsMuted)//静音模式--》有声模式
            {
                voice_but.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_voice1.png"));
                mediaElement.IsMuted = false;
                voice_Slider.IsEnabled = true;
            }
            else//有声模式--》静音模式
            {
                voice_but.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_voice0.png"));
                mediaElement.IsMuted = true;
                voice_Slider.IsEnabled = false;
            }
        }

        /// 
        /// 点击缩小放大时的代码
        /// 
        /// 
        /// 
        private void WindowMaxMin_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (windowType==windowType.min)//小模式--》大模式
            {
                PlayVideo playVideo = new PlayVideo();//大窗口
                 //显示大窗口之前的准备工作
                
                playVideo.media.UrlPath = urlPath;//传递路径
                playVideo.media.Position = mediaElement.Position;//同步进度
                playVideo.media.mediaElement.IsMuted = mediaElement.IsMuted;//是否是静音
                playVideo.media.mediaElement.Volume = mediaElement.Volume;//音量
                playVideo.media.mediaSlider.Maximum = mediaSlider.Maximum;//视频进度条
                playVideo.media.mediaSlider.Value = mediaSlider.Value;//视频进度条

                playVideo.media.voice_Slider.Maximum = voice_Slider.Maximum;//声音进度条
                playVideo.media.voice_Slider.Value = voice_Slider.Value;//声音进度条
                playVideo.media.voice_Slider.IsEnabled = voice_Slider.IsEnabled;//声音进度条

                playVideo.media.voice_but.Tag = voice_but.Tag;//静音Tag
                playVideo.media.voice_but.Source = voice_but.Source;//静音图片

                //同步播放状态
                if (isplaying)
                {
                    playVideo.media.mediaElement.Play();
                    playVideo.media.showPlayView();
                }
                else
                {
                    playVideo.media.showPauseView();
                }
                mediaElement.Pause();//暂停本地
                showPauseView();//调整为暂停样式
                allView.Visibility = Visibility.Hidden;//隐藏
                //显示大窗口
                playVideo.ShowDialog();
                //关闭大窗口之后的工作

                mediaElement.Position = playVideo.media.mediaElement.Position;//进度
                mediaElement.IsMuted = playVideo.media.mediaElement.IsMuted;//是否是静音
                mediaElement.Volume = playVideo.media.mediaElement.Volume;//音量
                mediaSlider.Maximum = playVideo.media.mediaSlider.Maximum;//视频进度条
                mediaSlider.Value = playVideo.media.mediaSlider.Value;//视频进度条

                voice_Slider.Maximum = playVideo.media.voice_Slider.Maximum;//声音进度条
                voice_Slider.Value = playVideo.media.voice_Slider.Value;//声音进度条
                voice_Slider.IsEnabled = playVideo.media.voice_Slider.IsEnabled;//声音进度条

                voice_but.Tag = playVideo.media.voice_but.Tag;//静音Tag
                voice_but.Source = playVideo.media.voice_but.Source;//静音图片
                if (playVideo.media.isplaying)//同步播放状态
                {
                    mediaElement.Play();
                    showPlayView();
                }
                else
                {
                    showPauseView();
                }
                allView.Visibility = Visibility.Visible;//显示
            }
            else//大模式--》小模式
            {
                //通知PlayVideo关闭
                if (closeWindow!=null)
                closeWindow?.Invoke();
            }
        }
        
        //播放结束
        private void MediaElement_MediaEnded(object sender, RoutedEventArgs e)
        {
            //设置视频路径
            //Console.WriteLine("设置视频路径" + urlPath);
            //mediaElement.Source = new Uri(urlPath);
            //mediaElement.Position = new TimeSpan();
            mediaSlider.Value = 0;
            newTime.Text = "00:00";
            mediaElement.Stop();
            showPauseView();
        }
        /// 
        /// 播放错误
        /// 
        /// 
        /// 
        private void MediaElement_ScriptCommand(object sender, MediaScriptCommandRoutedEventArgs e)
        {
            showPauseView();
            MessageBox.Show("播放错误");
        }
        /// 
        /// 屏幕播放按钮
        /// 
        /// 
        /// 
        private void BigPlay_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            mediaElement.Play();
            showPlayView();
        }
        /// 
        /// 暂停时的布局显示
        /// 
        private void showPauseView()
        {
            bigPlay.Visibility = Visibility.Visible;
            play_pause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_play1.png"));
            play_pause.Tag = "pause";
            isplaying = false;
            if (timer!=null)
            {
                timer.Enabled = false;
                timer.Stop();
                timer.Close();
                timer = null;
            }
        }

        /// 
        /// 播放时的布局显示
        /// 
        private void showPlayView()
        {
            bigPlay.Visibility = Visibility.Collapsed;
            play_pause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/icon_media_pause1.png"));
            play_pause.Tag = "play";
            isplaying = true;
            if (timer!=null)
            {
                timer.Enabled = false;
                timer.Stop();
                timer.Close();
                timer = null;
            }


            timer = new Timer(100);
            timer.Enabled = true;//是否执行
            timer.Elapsed += Timer_Elapsed;//执行的事件
            timer.Start();


        }
        /// 
        /// 延时器执行的代码
        /// 
        /// 
        /// 
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {

            mediaSlider.Dispatcher.Invoke(action);

            //VideoPressage = 0;

        }

        #endregion


        #region 方法
        /// 
        /// 停止并重置媒体使其从头播放。
        /// 
        public void stopMedia()
        {
            newTime.Text = "00:00";
            mediaSlider.Value = 0;
            mediaElement.Stop();
            showPauseView();
        }
        /// 
        /// 从当前位置播放媒体。
        /// 
        public void playMedia()
        {
            mediaElement.Play();
            showPlayView();
        }
        /// 
        /// 在当前位置暂停媒体。
        /// 
        public void pauseMedia()
        {
            mediaElement.Pause();
            showPauseView();
        }
        /// 
        /// 关闭媒体。
        /// 
        public void closeMedia()
        {
            mediaElement.Close();
            showPauseView();
        }
        #endregion

        public delegate void CloseWindow();
        private CloseWindow closeWindow;
        public void closeWin(CloseWindow close)
        {
            this.closeWindow = close;
        }

    }
}

放大的解决思路是创建一个页面,将一些参数传递过去,取消放大状态时在将实时数据返回,所以还有个页面(放大后的页面)

放大页面WPF代码 PlayVideo.xaml

    
        

        
    


放大页面C#代码 PlayVideo.xaml.cs
using System;
using System.Collections.Generic;
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.Shapes;

namespace System.Content.ProductReview
{
    /// 
    /// PlayVideo.xaml 的交互逻辑
    /// 
    public partial class PlayVideo : Window
    {
        public PlayVideo()
        {
            InitializeComponent();
            //media.windowMaxMin.
            media.WindowType = windowType.max;
            media.closeWin(CloseThis);
        }
        
        public void Path(string path) {
            media.UrlPath = path;
        }
        
        public void CloseThis()
        {
            this.Close();
        }

        private void MClose_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            CloseThis();
        }
    }
}

这种思路解决小文件问题不大,大文件可能就不行了,欢迎大家一起来探讨

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955278.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号