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;
- }
|