在WPF裡用MediaElement控制元件,實現一個迴圈播放單一視訊的程式,同時可以控制視訊的播放、暫停、停止。
一種方式,使用MediaElement.MediaEnded事件,在視訊播放結束後,自動重新播放;
另一種方式,使用WPF定時器,在定時器事件裡寫入視訊播放程式碼。
後者優點是可以控制迴圈時長,不必等到視訊播放結束就可以開始下一次播放,比如:同時啟動多個播放程式,使多個時長不同的視訊同時播放,無限迴圈,如果採用第一種方式,累計多次自動播放後,視訊內容就無法同步。
第一種方式:
1 XAML: 2 <MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="261" VerticalAlignment="Top" Width="507"/> 3 <Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="68,279,0,0" VerticalAlignment="Top" Width="75" Click="btnPlay_Click"/> 4 <Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="170,279,0,0" VerticalAlignment="Top" Width="75" Click="btnPause_Click"/> 5 <Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="295,279,0,0" VerticalAlignment="Top" Width="75" Click="btnStop_Click"/>
1 C#: 2 // 視窗載入事件 3 private void Window_Loaded(object sender, RoutedEventArgs e) 4 { 5 // 繫結視訊檔案 6 mediaElement.Source = new Uri("D:/bird.mp4"); 7 8 // 互動式控制 9 mediaElement.LoadedBehavior = MediaState.Manual; 10 11 // 新增元素載入完成事件 -- 自動開始播放 12 mediaElement.Loaded += new RoutedEventHandler(media_Loaded); 13 14 // 新增媒體播放結束事件 -- 重新播放 15 mediaElement.MediaEnded += new RoutedEventHandler(media_MediaEnded); 16 17 // 新增元素解除安裝完成事件 -- 停止播放 18 mediaElement.Unloaded += new RoutedEventHandler(media_Unloaded); 19 } 20 21 /* 22 元素事件 23 */ 24 private void media_Loaded(object sender, RoutedEventArgs e) 25 { 26 (sender as MediaElement).Play(); 27 } 28 29 private void media_MediaEnded(object sender, RoutedEventArgs e) 30 { 31 // MediaElement需要先停止播放才能再開始播放, 32 // 否則會停在最後一幀不動 33 (sender as MediaElement).Stop(); 34 (sender as MediaElement).Play(); 35 } 36 37 private void media_Unloaded(object sender, RoutedEventArgs e) 38 { 39 (sender as MediaElement).Stop(); 40 } 41 42 /* 43 播放控制按鈕的點選事件 44 */ 45 private void btnPlay_Click(object sender, RoutedEventArgs e) 46 { 47 mediaElement.Play(); 48 } 49 50 private void btnPause_Click(object sender, RoutedEventArgs e) 51 { 52 mediaElement.Pause(); 53 } 54 55 private void btnStop_Click(object sender, RoutedEventArgs e) 56 { 57 mediaElement.Stop(); 58 }
第二種方式:
注:使用DispatcherTimer,需要新增System.Windows.Threading名稱空間。
1 XAML: 2 <MediaElement x:Name="mediaElement" HorizontalAlignment="Left" Height="243" Margin="19,10,0,0" VerticalAlignment="Top" Width="394" LoadedBehavior ="Manual"/> 3 <Button x:Name="btnPlay" Content="Play" HorizontalAlignment="Left" Margin="52,270,0,0" VerticalAlignment="Top" Width="75" Click="btnPlay_Click"/> 4 <Button x:Name="btnPause" Content="Pause" HorizontalAlignment="Left" Margin="163,270,0,0" VerticalAlignment="Top" Width="75" Click="btnPause_Click"/> 5 <Button x:Name="btnStop" Content="Stop" HorizontalAlignment="Left" Margin="266,270,0,0" VerticalAlignment="Top" Width="75" Click="btnStop_Click"/>
1 C#: 2 DispatcherTimer timer = new DispatcherTimer(); // 定時器timer 3 int durTime = 5; // 視訊播放時長,也就是迴圈週期 4 5 // 視窗載入事件 6 private void Window_Loaded(object sender, RoutedEventArgs e) 7 { 8 mediaElement.Source = new Uri("D:/bird.mp4"); // 繫結視訊檔案 9 10 mediaElement.Play(); // 設定啟動播放 11 timer.Interval = new TimeSpan(0, 0, 0, durTime); // 設定定時器重複週期 12 timer.Tick += new EventHandler(timerEvent); // 設定定時器事件 13 14 timer.Start(); // 啟動定時器 15 } 16 17 // 定時器事件 18 public void timerEvent(object sender, EventArgs e) 19 { 20 // MediaElement需要先停止播放才能再開始播放, 21 // 否則會停在最後一幀不動 22 mediaElement.Stop(); 23 mediaElement.Play(); 24 } 25 26 /* 27 播放控制按鈕的點選事件 28 */ 29 private void btnPlay_Click(object sender, RoutedEventArgs e) 30 { 31 mediaElement.Play(); // 開始播放 32 timer.Start(); // 重新啟動定時器 33 } 34 35 private void btnPause_Click(object sender, RoutedEventArgs e) 36 { 37 mediaElement.Pause(); // 暫停當前播放 38 timer.Stop(); // 停止定時器 39 } 40 41 private void btnStop_Click(object sender, RoutedEventArgs e) 42 { 43 mediaElement.Stop(); // 停止當前播放 44 timer.Stop(); // 停止定時器 45 }
專案原始碼下載連結:https://files.cnblogs.com/files/walker-cheng/WpfVideoCyclePlayer.zip