如何在WPF中向后播放视频? [英] How to play video backwards in 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屋!