WPF中可以使用MediaElement控件来进行音视频播放,然后需要做个进度条啥的,但是MediaElement.Position(进度)和MediaElement.NaturalDuration居然都不是依赖属性,简直不能忍!

好吧,首先说说比较传统的做法(winform?)

slider用来显示进度以及调整进度,tb1显示当前进度的时间值,tb2显示视频的时长。

player_Loaded 事件中使用DispatcherTimer来定时获取当前视频的播放进度,

player_MediaOpened 事件中获取当前视频的时长(只有在视频加载完成后才可以获取到)

slider_ValueChanged 事件中执行对视频进度的调整

xaml:
<MediaElement Name="player" Source="e:\MVVMLight (1).wmv" Loaded="player_Loaded" 
                      MediaOpened="player_MediaOpened"/>
        <Slider Grid.Row="1"  Margin="10" Name="slider" ValueChanged="slider_ValueChanged"/>
        <WrapPanel Grid.Row="1"  Margin="0,40,0,0">
            <TextBlock Name="tb1" Width="120"/>
            <TextBlock Name="tb2" Width="120"/>
        </WrapPanel>

后台代码:
private void player_Loaded(object sender, RoutedEventArgs e)
        {
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1000);
            timer.Tick += (ss, ee) =>
            {
                //显示当前视频进度
                var ts = player.Position;
                tb1.Text = string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);slider.Value = ts.TotalMilliseconds;
            };
            timer.Start();
        }

        private void player_MediaOpened(object sender, RoutedEventArgs e)
        {
            //显示视频的时长
            var ts = player.NaturalDuration.TimeSpan;
            tb2.Text = string.Format("{0:00}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
            slider.Maximum = ts.TotalMilliseconds;
        }

        private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            //调整视频进度
            var ts = TimeSpan.FromMilliseconds(e.NewValue);
            player.Position = ts;
        }
View Code

相关文章:

  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-05
  • 2021-08-13
猜你喜欢
  • 2021-09-30
  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案