2015-06-20 28 views
3

我想在WPF中向後順利地播放視頻。我正在使用MediaElement播放視頻。我讀this post,建議定期更換MediaElement.Position以模仿倒帶行爲。如何在WPF中向後播放視頻?

我嘗試下面的代碼,用於改變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 
    } 
} 

位置。在上面的代碼中我試圖從2分鐘向後播放視頻到1分鐘。 它在mePlayer.Position = TimeSpan.FromSeconds(t)上給我'System.OverflowException'。

如果有人知道如何在WPF中向後播放視頻,請幫助我實現此效果。謝謝。

+0

雙M = 1 /幀率;沒有被零除? –

+0

幀率的數值是24 –

+0

它不是整數? –

回答

1

要做到這一點順利,你應該使用Timer。假設幀速率是24fps,則這意味着每1/24 = 0.0416秒或大約42毫秒是一幀。所以,如果你的計時器滴答每42ms可以向後移動mePlayer.Position

XAML:

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

代碼:

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(); 
    } 
+0

我已經試過了你說的。它僅適用於低質量視頻。如果系統規格很高,它可以順利地運行高質量視頻。 –

+0

如果您可以對視頻進行重新編碼,則可能需要使用FFmpeg或類似功能來播放此解決方案的關鍵幀設置。它會增加你的文件大小,但更多的關鍵幀*可能*提供更流暢的播放。參見:http://stackoverflow.com/questions/14117757/how-to-control-key-frame-generation-of-ffmpeg。 – goobering