0

I have created a Video Player using Media Element in WPF, where I can able to Pause, Play, Stop and Forward Backward to Some particular position.

But I would like to play the video backward (opposite direction) when the Play backward button clicks and to play forward when forward clicks.

Is there any way to achieve this,

Here is my code,

 <ToolBar Margin="5">
                <Button x:Name="Open" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image Source="..\..\Images\folder.png" />
                </Button>
                <Separator />
                <Button x:Name="PlayPause" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image x:Name="imgPlayPause" Source="..\..\Images\play.png" />
                </Button>
                <Separator />
                <Button x:Name="Stop" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image Source="..\..\Images\stop.png" />
                </Button>
                <Separator />
                <Button x:Name="PrevFrame" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image Source="..\..\Images\slow_frwd.png" />
                </Button>
                <Separator />
                <Button x:Name="NextFrame" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image Source="..\..\Images\fast_frwd.png" />
                </Button>
                <Separator />
                <Button x:Name="Refresh" Click="ControlVideoFlow" Margin="2" Height="30" Width="30" Cursor="Hand">
                    <Image Source="..\..\Images\refresh.png" />
                </Button>
 </ToolBar>

 <MediaElement Name="mePlayer" LoadedBehavior="Manual" ScrubbingEnabled="True" Stretch="UniformToFill" MediaFailed="mePlayer_MediaFailed" UnloadedBehavior="Manual" />

 <StatusBar Background="#E0DFE1" VerticalAlignment="Top" Margin="5">
                <StatusBar.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                        </Grid>
                    </ItemsPanelTemplate>
                </StatusBar.ItemsPanel>
                <StatusBarItem>
                    <TextBlock Name="lblProgressStatus">00:00:00</TextBlock>
                </StatusBarItem>
                <StatusBarItem Grid.Column="1" HorizontalContentAlignment="Stretch" Cursor="Hand">
                    <Slider Name="sliProgress" IsMoveToPointEnabled="True" PreviewMouseLeftButtonUp="sliProgress_PreviewMouseLeftButtonUp" Thumb.DragStarted="sliProgress_DragStarted" Thumb.DragCompleted="sliProgress_DragCompleted" ValueChanged="sliProgress_ValueChanged" />
                </StatusBarItem>
                <StatusBarItem Grid.Column="2">
                    <ProgressBar Name="pbVolume" Width="50" Height="12" Maximum="1" Value="{Binding ElementName=mePlayer, Path=Volume}" />
                </StatusBarItem>
 </StatusBar>

Code Behind,

    public bool mediaPlayerIsPlaying = false;
    private bool userIsDraggingSlider = false;
    public string control = string.Empty;
    DispatcherTimer timer = new DispatcherTimer();

    public VideoAnalyser()
    {
        InitializeComponent();

        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += timer_Tick;
        timer.Start();
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if ((mePlayer.Source != null) && (mePlayer.NaturalDuration.HasTimeSpan) && (!userIsDraggingSlider))
        {
            Dispatcher.Invoke(() =>
            {
                sliProgress.Minimum = 0;
                sliProgress.Maximum = mePlayer.NaturalDuration.TimeSpan.TotalSeconds;
                sliProgress.Value = mePlayer.Position.TotalSeconds;
            });
        }
    }

    private void sliProgress_PreviewMouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        mePlayer.Position = TimeSpan.FromSeconds(sliProgress.Value);
    }

    private void sliProgress_DragStarted(object sender, System.Windows.Controls.Primitives.DragStartedEventArgs e)
    {
        userIsDraggingSlider = true;
    }

    private void sliProgress_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
    {
        userIsDraggingSlider = false;
        mePlayer.Position = TimeSpan.FromSeconds(sliProgress.Value);
    }

    private void sliProgress_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        lblProgressStatus.Text = TimeSpan.FromSeconds(sliProgress.Value).ToString(@"hh\:mm\:ss");
    }

    private void mePlayer_MediaFailed(object sender, ExceptionRoutedEventArgs e)
    {
        MessageBox.Show("Media Failed");
    }

 private async void ControlVideoFlow(object sender, RoutedEventArgs e)
    {
        try
        {
            Button button = (Button)sender;
            switch (button.Name)
            {
                case "Open":
                    OpenFileDialog openFileDialog = new OpenFileDialog();
                    openFileDialog.Filter = "Media files (*.mp3;*.mpg;*.mpeg;*.mp4)|*.mp3;*.mpg;*.mpeg;*.mp4|All files (*.*)|*.*";
                    openFileDialog.Multiselect = true;
                    if (openFileDialog.ShowDialog() == true)
                    {
                        mePlayer.Source = new Uri(openFileDialog.FileName, UriKind.Relative);
                        mePlayer.Play();
                        mePlayer.Pause();
                        mediaPlayerIsPlaying = false;
                        imgPlayPause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/play.png"));
                        control = "pause";
                        cnvMplayer.Visibility = Visibility.Visible;
                        await Task.Delay(300);
                        grdMplayer.Visibility = Visibility.Collapsed;
                    }
                    break;

                case "PlayPause":
                    if ((mePlayer != null) && (mePlayer.Source != null))
                    {
                        switch (control)
                        {
                            case "":
                                imgPlayPause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/play.png"));
                                mePlayer.Pause(); control = "pause";
                                mediaPlayerIsPlaying = false;
                                break;
                            case "pause":
                                imgPlayPause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/pause.png"));
                                mePlayer.Play(); control = "";
                                mediaPlayerIsPlaying = true;
                                break;
                        };
                    }
                    break;

                case "Stop":
                    if ((mePlayer != null) && (mePlayer.Source != null))
                    {
                        mePlayer.Stop();
                        mediaPlayerIsPlaying = false;
                        imgPlayPause.Source = new BitmapImage(new Uri("pack://application:,,,/Sources/Images/play.png"));
                        control = "pause";
                        sliProgress.Value = 0;
                        grdMplayer.Visibility = Visibility.Visible;
                        cnvMplayer.Visibility = Visibility.Collapsed;
                        mePlayer.Source = null;
                    }
                    break;

                case "PrevFrame":
                    frameReduceorIncrease(-30);
                    break;

                case "NextFrame":
                    frameReduceorIncrease(30);
                    break;

                case "Refresh":
                    TimeSpan position = mePlayer.Position;
                    Uri source = mePlayer.Source;
                    mePlayer.Source = null;
                    mePlayer.Source = source;
                    imgPlayPause.Source = new BitmapImage(new Uri("pack://application:,,,/Images/play.png"));
                    mePlayer.Play(); control = "pause";
                    mediaPlayerIsPlaying = false;
                    mePlayer.Position = position - TimeSpan.FromMilliseconds(10);
                    await Task.Delay(TimeSpan.FromMilliseconds(500));
                    mePlayer.Pause();
                    break;
            };
        }
        catch (Exception ex)
        {

        }
    }
Vinoth Kumar
  • 91
  • 1
  • 10

0 Answers0