加载中...

写一个简单的视频播放器

  1. 前端xaml模块
<Window x:Class="Wpf_new.MainWindow"
        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:Wpf_new"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="500">
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height=" auto"/>
            <RowDefinition Height=" auto"/>
        </Grid.RowDefinitions><!--设置成三行-->
        <MediaElement  x:Name="_MediaElement" LoadedBehavior="Manual"/> <!--播放器命名为_MediaElement,方便后端调用-->
        <Border x:Name="_Border" Background="pink">
            <TextBlock x:Name="_TextBlock" Foreground="Black"  Text="播放器" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        </Border>
        <StackPanel  Grid.Row="1" Orientation="Horizontal">
            <Button  Content="打开" Width=" 60" Height=" 25" Margin=" 5" Click="OpenMedia" />
            <Button  Content="播放" Width=" 60" Height=" 25" Margin=" 5" Click="PlayMedia" />
            <Button  Content="暂停" Width=" 60" Height=" 25" Margin=" 5" Click="StopMedia" />
            <Button  Content="后退" Width=" 60" Height=" 25" Margin=" 5" Click="BackMedia" />
            <Button  Content="快进" Width=" 60" Height=" 25" Margin=" 5" Click="ForwardMedia" /><!-- 设置点击事件-->
            <TextBlock Text="音量" Width=" 60" Height=" 25" Margin=" 5"/>
            <Slider x:Name="_Slider"  Minimum="0" Maximum="100" Value="25" Width=" 120" VerticalAlignment="Center" HorizontalAlignment="Center" ValueChanged="_Slider_ValueChanged"/><!--利用滑块Slider设置音量键,最大值为100,最小值为0,当前值为25,ValueChanged是一个事件处理程序的绑定,当滑块的值发生变化时会触发-->
        </StackPanel>
        <Grid  Grid.Row="2">
            <ProgressBar x:Name="_ProgressBar" Height=" 10" Margin="5"/><!--设置进度条-->
        </Grid>
    </Grid>

</Window>
* 页面展示
![](https://img2024.cnblogs.com/blog/2815618/202412/2815618-20241213125657761-1635857505.png)

  1. 后端cs模块
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Threading;

namespace Wpf_new
{
    public partial class MainWindow : Window
    {
        private string file =string.Empty;<!--定义一个字符串变量file,用来保存打开的媒体文件的路径-->
        public MainWindow()
        {
            InitializeComponent();//每当创建MainWindow类的实例时会执行这个构造函数。InitializeComponent()用于初始化窗口及其所有控件。

            // 订阅 MediaOpened 事件以设置进度条的最大值
            _MediaElement.MediaOpened += (s, e) => //利用匿名函数的lambda表达式
            {
                if (_MediaElement.NaturalDuration.HasTimeSpan)//判断媒体文件是否有有效的时间长度
                {
                    var ts = _MediaElement.NaturalDuration.TimeSpan;//从 NaturalDuration 属性中获取一个 TimeSpan 对象,它代表了媒体文件的实际持续时间。
                    _ProgressBar.Maximum = ts.TotalMilliseconds;//设置播放进度条的总长度(将进度条 (_ProgressBar) 的最大值设置为媒体文件总时长的毫秒数。这意味着进度条的范围将与媒体文件的长度相对应,使得用户可以通过查看进度条了解当前播放位置和剩余时间。)
                }
            };

            DispatcherTimer timer = new DispatcherTimer();//创建了一个计时器DispatcherTimer,每500毫秒更新一次进度条的位置,确保进度条与当前播放的位置同步
            timer.Interval = TimeSpan.FromMilliseconds(500); // 更新间隔调整为 500ms
            timer.Tick += (s, e) =>
            {
                if (_MediaElement.NaturalDuration.HasTimeSpan && _MediaElement.Source != null)
                //检查媒体文件是否有一个有效的时间跨度&&检查媒体播放器是否已经加载了有效的媒体源文件
                {
                    var ts = _MediaElement.Position;//获取当前媒体播放位置,并将其赋值给变量 ts
                    _ProgressBar.Value = Math.Min(ts.TotalMilliseconds, _ProgressBar.Maximum);
//计算当前播放位置(转换成毫秒数)和进度条最大值之间的最小值。这样做是为了防止进度条的值超出它的最大限制.
                }
            };
            timer.Start();//启动定时器。
        }
       

        private void OpenMedia(object sender, RoutedEventArgs e)
        {
            var openFileDialog = new Microsoft.Win32.OpenFileDialog()//创建一个打开文件对话框实例
            {
                Filter = "视频文件(.mp4)|*.mp4",//设定对话框中允许打开的文件类型,这里是.mp4文件
                Multiselect = false ,//不允许用户选择多个文件
            };
            var result = openFileDialog.ShowDialog ();//显示对话框并等待用户选择文件,返回结果
            if (result == true ) 
            {
                file = openFileDialog.FileName;//将选择的文件路径保存到file变量中
                _MediaElement.MediaEnded -= _MediaElement_MediaEnded;//移除任何已存在的MediaEnded事件处理程序(防止重复订阅)。
                _MediaElement.MediaEnded += _MediaElement_MediaEnded;//在媒体播放结束时触发的方法
                _MediaElement.Source = new System.Uri(file);
                this.Title = file;
                _TextBlock.Text = file;

            }
          


        }

        private void _MediaElement_MediaEnded(object sender, RoutedEventArgs e)
        {
            if (_MediaElement.NaturalDuration.HasTimeSpan) 
            {
            var ts = _MediaElement.NaturalDuration.TimeSpan ;
                _ProgressBar .Maximum = ts.TotalMilliseconds ;
            }
        }

        private void PlayMedia(object sender, RoutedEventArgs e)//播放
        {
            _MediaElement.Play();
            _Border.Visibility = Visibility.Collapsed;//隐藏包含“播放器”文本的边框
        }

        private void StopMedia(object sender, RoutedEventArgs e)//暂停
        {
            _MediaElement.Pause();
        }

        private void BackMedia(object sender, RoutedEventArgs e)//快进
        {
            _MediaElement.Position = _MediaElement.Position-TimeSpan.FromSeconds(10);
        }

        private void ForwardMedia(object sender, RoutedEventArgs e)//后退

        {
            _MediaElement.Position = _MediaElement.Position + TimeSpan.FromSeconds(10);
        }

        private void _Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)//音量调节
        {
            _MediaElement .Volume = _Slider.Value;
        }
    }
}

posted @ 2024-12-13 13:39  神乐羊  阅读(20)  评论(0)    收藏  举报