如何在WPF中向后播放视频? [英] How to play video backwards in WPF?

查看:116
本文介绍了如何在WPF中向后播放视频?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在WPF中向后平滑播放视频。我正在使用 MediaElement 播放视频。我阅读了这篇文章,该文章建议更改 MediaElement.Position 定期模仿倒带行为。



我尝试了以下代码来更改 MediaElement.Position

  private void Button_Click(对象发送者,RoutedEventArgs e)
{
mePlayer.Pause(); //先暂停媒体播放器
double m = 1 / frameRate; //计算每一帧的时间
double t = 120; //以秒为单位的视频总长度
mePlayer.Position = TimeSpan.FromMinutes(2); //从2分钟
开始播放视频,而(t> = 60)//检查时间是否超过1分钟
{
t = t-m; //从总秒数中减去单帧时间
mePlayer.Position = TimeSpan.FromSeconds(t); //设置视频的位置
}
}

在上面的代码中,我试图将视频从2分钟向后播放1分钟。
它在 mePlayer.Position = TimeSpan.FromSeconds(t)上给我'System.OverflowException'。



<如果有人知道如何在WPF中向后播放视频,请帮助我实现此效果。谢谢。

解决方案

要顺利进行,您应该使用 Timer 。假设帧速率为24 fps,则意味着每1/24 = 0.0416秒或大约42毫秒为一帧。因此,如果您的计时器每42毫秒计时一次,您可以向后移动 mePlayer.Position



XAML:

 < MediaElement x:Name = mePlayer Source = C:\Sample.mp4 
LoadedBehavior = Manual ScrubbingEnabled = True />

代码:

  System.Windows.Threading.DispatcherTimer dispatcherTimer; 
int t = 240000; // 4分钟= 240,000毫秒

public MainWindow()
{
InitializeComponent();

dispatcherTimer =新的System.Windows.Threading.DispatcherTimer();
dispatcherTimer.Tick + =新的EventHandler(dispatcherTimer_Tick);
//每42毫秒滴答一次=一秒内滴答24次
dispatcherTimer.Interval = new TimeSpan(0,0,0,0,42);

}

private void dispatcherTimer_Tick(object sender,EventArgs e)
{
//每42毫秒(或24 fps)返回1帧
t = t-42;
mePlayer.Position = TimeSpan.FromMilliseconds(t);
}
private void Window_Loaded(对象发送者,RoutedEventArgs e)
{
mePlayer.Play();
}
private void Button_Click(对象发送者,RoutedEventArgs e)
{
//暂停并转到视频的第4分钟,然后开始向后播放
mePlayer.Pause ();
mePlayer.Position = TimeSpan.FromMinutes(4);
dispatcherTimer.Start();
}


I want to smoothly play video in backwards direction in WPF. I am using MediaElement to play the video. I read this post which suggests changing MediaElement.Position periodically to mimic the rewinding behaviour.

I tried following code for changing position of MediaElement.Position

private void Button_Click(object sender, RoutedEventArgs e)
{
    mePlayer.Pause();                               //Pause the media player first
    double m = 1 / frameRate;                       //Calculate the time for each frame
    double t = 120;                                 //Total length of video in seconds
    mePlayer.Position = TimeSpan.FromMinutes(2);    //Start video from 2 min
    while (t >= 60)                                 //Check if time exceeds 1 min
    {
        t = t - m;                                  //Subtract the single frame time from total seconds
        mePlayer.Position = TimeSpan.FromSeconds(t);//set position of video
    }
}

In above code I am trying to play video backwards from 2 min to 1 min. It's giving me 'System.OverflowException' on mePlayer.Position = TimeSpan.FromSeconds(t).

If anyone know how play video backwards in WPF, please help me to achieve this effect. Thank you.

解决方案

To do it smoothly you should use a Timer. Assuming the frame rate is 24 fps, then it means that is one frame every 1/24 = 0.0416 second or approximately 42 millisecond. So if your timer ticks every 42ms you can move mePlayer.Position backward:

XAML:

<MediaElement x:Name="mePlayer" Source="C:\Sample.mp4"
              LoadedBehavior="Manual" ScrubbingEnabled="True"/>

Code:

    System.Windows.Threading.DispatcherTimer dispatcherTimer;
    int t = 240000; // 4 minutes = 240,000 milliseconds

    public MainWindow()
    {
        InitializeComponent();

        dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
        dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
        //tick every 42 millisecond = tick 24 times in one second
        dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 42);

    }

    private void dispatcherTimer_Tick(object sender, EventArgs e)
    {
        // Go back 1 frame every 42 milliseconds (or 24 fps)
        t = t - 42;
        mePlayer.Position = TimeSpan.FromMilliseconds(t);
    }
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        mePlayer.Play();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        // Pause and go to 4th minute of the video then start playing backward
        mePlayer.Pause();                               
        mePlayer.Position = TimeSpan.FromMinutes(4);
        dispatcherTimer.Start();
    }

这篇关于如何在WPF中向后播放视频?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆