WF MediaElement 视频播放器

来源:互联网 发布:淘宝评价怎么截图 编辑:程序博客网 时间:2024/06/04 22:16
<!-- .xmal文件 --><Controls:MetroWindow        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"        mc:Ignorable="d" x:Class="spph.VideoPlayingWindow"        Title="视频截图"        Height="600" Width="1000" MinHeight="600" MinWidth="1000"        ShowInTaskbar="False"        WindowStartupLocation="CenterOwner"        GlowBrush="{DynamicResource AccentColorBrush}">    <TabControl x:Name="THREETabControl" Margin="5,5,5,5"  >        <TabItem Name="videoTabItem" Header="视频播放" IsSelected="True" Width="198">            <DockPanel Name="dockpanel_Video" LastChildFill="true">                <StackPanel Name="leftPanel_VideoList"  DockPanel.Dock="Left" Width="180">                    <StackPanel x:Name="InfoPanel">                        <TextBlock Text="视频列表" FontSize="20" FontWeight="Bold" FontFamily="Microsoft YaHei" Foreground="#FF434D55" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" DockPanel.Dock="Top" Margin="10" Width="180" TextAlignment="Center" >                            <TextBlock.Background>                                <SolidColorBrush Color="#FFFFFFFF"/>                            </TextBlock.Background>                        </TextBlock>                    </StackPanel>                                        <StackPanel>                        <ListView Name="listView_Video" SelectionMode="Single" SelectionChanged="listView_Video_SelectionChanged"></ListView>                      </StackPanel>                                    </StackPanel>                <Grid Background="Azure" Margin="2,2,2,2">                    <Grid.ColumnDefinitions>                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                        <ColumnDefinition Width="2*" />                    </Grid.ColumnDefinitions>                    <Grid.RowDefinitions>                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                        <RowDefinition Height="10*" />                    </Grid.RowDefinitions>                    <MediaElement Name="mediaElement_Video"                                                                    ScrubbingEnabled="True"                                                                 LoadedBehavior="Manual"                                  Volume="{Binding ElementName=volumeSlider, Path=Value}"                                   Grid.RowSpan="9"  Margin="0,5,0,0"                                   MediaOpened="mediaOpened_Video"                                  MediaEnded="mediaEnded_Video" Grid.ColumnSpan="9" />                    <Slider x:Name="volumeSlider" Minimum="0" Maximum="1" Value="0.5" Width="180" Margin="0,15,12,0" Grid.Row="10" Grid.Column="7" Grid.ColumnSpan="2" />                    <Slider x:Name="playSlider" Width="740" Margin="5,-1,5,0" Value ="0" Grid.Row="9" Grid.ColumnSpan="9" ValueChanged="playSlider_ValueChanged" PreviewMouseUp="playSlider_PreviewMouseUp" />                    <TextBlock Grid.Row="10" Margin="7,10,0,-2" Name="textBlock_Volumn" Text="音 量" Foreground="#FF9AE500" FontSize="20" Grid.Column="6" />                    <TextBlock Grid.Row="9" Grid.Column="7" Margin="44,10,0,0" FontSize="10" Foreground="Gray" Name="textBlock_CurrentTime" />                    <TextBlock Grid.Row="9" Grid.Column="8" Margin="0,10,0,0" FontSize="10" Foreground="Gray" Name="textBlock_AllTime" />                    <TextBlock Grid.Row="9" Grid.Column="0" Name="textbBock_SpeedInfo"></TextBlock>                    <Button Background="{x:Null}" Content="停 止" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonStop" Grid.Row="10" Click="buttonStop_Click" Grid.Column="2" />                    <Button Background="{x:Null}" Content="快 退" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonFR"   Grid.Row="10" Click="buttonFR_Click" Grid.Column="3" />                    <Button Background="{x:Null}" Content="播 放" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonPlay" Grid.Row="10" Click="buttonPlay_Click" Grid.Column="4"  />                                      <Button Background="{x:Null}" Content="快 进" Cursor="Hand" FontSize="20" Foreground="#FF9AE500" Margin="1,1,1,1" Name="buttonFF"   Grid.Row="10" Click="buttonFF_Click" Grid.Column="5" />                </Grid>            </DockPanel>        </TabItem>        <TabItem Name="imageTabItem" Header="图片展示" Width="198">        </TabItem>    </TabControl></Controls:MetroWindow>

.cs文件:

using System;using System.Collections.Generic;using System.Linq;using System.Text;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;using System.Windows.Threading;using System.IO;using System.Threading;using spph.Model;using MahApps.Metro.Controls;namespace spph{    /// <summary>    /// Interaction logic for VideoPlaying.xaml    /// </summary>    public partial class VideoPlayingWindow : MetroWindow    {        //全局变量 -- 加载视频列表        private List<string> videoList = new List<string>();        //计时器,定时更新进度条和播放时间         private DispatcherTimer tmrProgress = new DispatcherTimer();        //在鼠标拖动Thumb的过程中记录其值。        private TimeSpan ts = new TimeSpan();        public VideoPlayingWindow()        {            InitializeComponent();            InitVideoList();            listView_Video.ItemsSource = videoList;          //  this.mediaElement_Video.Play();            tmrProgress = new DispatcherTimer();            //设置计时器的时间间隔为1秒            tmrProgress.Interval = new TimeSpan(0, 0, 1);            //计时器触发事件处理            tmrProgress.Tick += SetDisplayMessage;            SetImageForMediaElement();        }        public void InitVideoList()        {            videoList = new List<string>();            this.mediaElement_Video.LoadedBehavior = MediaState.Manual;              string[] filenames = Directory.GetFiles(LocalData.VideoPath);            foreach (string filename in filenames)            {                if (filename.EndsWith(".mp4"))                {                     videoList.Add(filename.Substring(filename.LastIndexOf("\\") + 1));                }            }            this.mediaElement_Video.Source = new Uri(filenames[0]);            this.mediaElement_Video.Play();         }        //将录像的第一帧作为播放前MediaElement显示的录像截图        public void SetImageForMediaElement()        {            mediaElement_Video.Play();            mediaElement_Video.Pause();            mediaElement_Video.Position = TimeSpan.Zero;        }        //计时器触发事件处理        private void SetDisplayMessage(Object sender, System.EventArgs e)        {            if (mediaElement_Video.NaturalDuration.HasTimeSpan)            {                TimeSpan currentPositionTimeSpan = mediaElement_Video.Position;                string currentPosition = string.Format("{0:00}:{1:00}:{2:00}", (int)currentPositionTimeSpan.TotalHours, currentPositionTimeSpan.Minutes, currentPositionTimeSpan.Seconds);                TimeSpan totaotp = mediaElement_Video.NaturalDuration.TimeSpan;                string totalPostion = string.Format("{0:00}:{1:00}:{2:00}", (int)totaotp.TotalHours, totaotp.Minutes, totaotp.Seconds);                textBlock_CurrentTime.Text = currentPosition;                playSlider.Value = mediaElement_Video.Position.TotalSeconds;            }        }        //点击停止按钮相应        private void buttonStop_Click(object sender, EventArgs e)        {            this.mediaElement_Video.Stop();        }               //点击播放按钮        private void buttonPlay_Click(object sender, EventArgs e)        {            //启动计时器 -- 下面这句话尤为重要,缺少滚动条停止,当前时间为00:00:00            //需要修改,当引入播放新的视频时,重新启动计时器            tmrProgress.Start();            if (this.buttonPlay.Content.ToString() == "播 放")            {                this.mediaElement_Video.Play();                this.buttonPlay.Content = "暂 停".ToString();            }            else              {                this.mediaElement_Video.Pause();                this.buttonPlay.Content = "播 放".ToString();            }                  }        //点击快进按钮        private void buttonFF_Click(object sender, EventArgs e)        {            this.mediaElement_Video.Position = this.mediaElement_Video.Position + TimeSpan.FromSeconds(10);            textbBock_SpeedInfo.Text = "快进十秒";            textbBock_SpeedInfo.Visibility = Visibility.Visible;            //Thread.Sleep(3000);            textbBock_SpeedInfo.Visibility = Visibility.Hidden;        }        //点击快退按钮        private void buttonFR_Click(object sender, EventArgs e)        {            this.mediaElement_Video.Position = this.mediaElement_Video.Position - TimeSpan.FromSeconds(10);            textbBock_SpeedInfo.Text = "后退十秒";            textbBock_SpeedInfo.Visibility = Visibility.Visible;            //延迟有问题            //Thread.Sleep(3000);            textbBock_SpeedInfo.Visibility = Visibility.Hidden;        }        //TODO现在还不知道MediaElement的MediaOpened和MediaEnded事件的作用        //媒体时关闭,发生        private void mediaEnded_Video(object sender, EventArgs e)        {            mediaElement_Video.Position = TimeSpan.Zero;            mediaElement_Video.Stop();        }        //在加载媒体完成,发生        private void mediaOpened_Video(object sender, EventArgs e)        {            playSlider.Minimum = 0;            playSlider.Maximum = mediaElement_Video.NaturalDuration.TimeSpan.TotalSeconds;            TimeSpan totaotp = mediaElement_Video.NaturalDuration.TimeSpan;            textBlock_AllTime.Text = "/" + string.Format("{0:00}:{1:00}:{2:00}", (int)totaotp.TotalHours, totaotp.Minutes, totaotp.Seconds);            textBlock_CurrentTime.Text = "00:00:00";        }        //拖拉播放进度 -- 设置        private void playSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)         {            ts = TimeSpan.FromSeconds(e.NewValue);            string currentPosition = string.Format("{0:00}:{1:00}:{2:00}", (int)ts.TotalHours, ts.Minutes, ts.Seconds);            textBlock_CurrentTime.Text = currentPosition;        }        //当拖动Thumb的鼠标放开时,从指定时间开始播放        private void playSlider_PreviewMouseUp(object sender, MouseButtonEventArgs e)        {            mediaElement_Video.Position = ts;        }        //点击右侧视频,加以播放        private void listView_Video_SelectionChanged(object sender, SelectionChangedEventArgs e)        {            string fileName = this.listView_Video.SelectedValue.ToString();            this.mediaElement_Video.Source = new Uri( LocalData.VideoPath + "//" + fileName);            this.mediaElement_Video.Play();        }    }}



0 0