WF MediaElement 视频播放器

<!-- .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();
        }
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值