最近改造公司的播控系統(tǒng)炉旷,客戶端采用了 WPF 進(jìn)行開發(fā),IDE 是 VS 2022(C#)辙喂。
20230809 添加:WPF 實(shí)現(xiàn)圖片/視頻自動輪播(VLC/定時(shí)器)
WPF 的代碼很簡單对湃,給 Grid 一個(gè)名稱就好了。
// WPF
<Grid x:Name="Wrapper"></Grid>
由于 MediaElement 可以播放視頻欣范,也能播放圖片变泄,所以就直接采用了。
原理就是恼琼,采用了兩個(gè) MediaElement妨蛹,交替顯示內(nèi)容,這樣可以避免單個(gè) MediaElement 在切換素材的時(shí)候,短暫出現(xiàn)的 “黑屏現(xiàn)象”。
主要需要注意 MediaElement 占用內(nèi)存的問題凿叠,所以凄吏,一定要及時(shí)移除播放完畢的 MediaElement=僦稀?溜酢城看!
// C#
public partial class MainWindow : Window
{
readonly Timer _timer; // 單個(gè)視頻播放的定時(shí)器(有可能視頻時(shí)長大于播放時(shí)長)
readonly string[] _videos;
int _idx;
MediaElement _player1, _player2;
public MainWindow()
{
InitializeComponent();
_idx = 0;
_videos = Directory.GetFiles("<素材所在的路徑>"); // 獲取待播放的素材列表
_timer = new()
{
Interval = 10000 // 單個(gè)素材播放的時(shí)長(10秒)
};
_timer.Elapsed += Timer_Elapsed;
// 設(shè)置窗體的標(biāo)題潘飘、樣式(無邊框)乐严、位置瘤袖、窗體大小等等
Title = "Player";
AllowsTransparency = true;
WindowStyle = WindowStyle.None;
WindowStartupLocation = WindowStartupLocation.Manual;
Top = 0;
Left = 0;
Width = 1152;
Height = 640;
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
_player1 = InitPlayer();
_player1.Source = new(_videos[_idx], UriKind.Absolute);
Wrapper.Children.Add(_player1); // 窗體加載完畢后,將第一個(gè)播放器添加到界面中
_player2 = PreparePlayer(); // 準(zhǔn)備第二個(gè)播放器昂验,但不添加到界面中
_timer.Start(); // 計(jì)時(shí)器開始計(jì)時(shí)
_player1.Play(); // 第一個(gè)播放器開始播放
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(_player2.Play); // 計(jì)時(shí)器時(shí)間到捂敌,播放第二個(gè)播放器的內(nèi)容
}
private void Player_Loaded(object sender, RoutedEventArgs e)
{
_player1.Stop();
_player1.Close();
Wrapper.Children.Remove(_player1); // 將第一個(gè)播放器從界面中移除
_player1 = _player2;
_player2 = PreparePlayer();
}
private void Player_MediaOpened(object sender, RoutedEventArgs e)
{
if (sender == _player2)
{
Wrapper.Children.Add(_player2); // 將下一個(gè)播放器添加到界面中
}
}
// 如果不需要計(jì)時(shí)器,可以用這個(gè)事件既琴,在上一個(gè)素材播放完畢后占婉,自動切換播放下一個(gè)素材
//private void Player_MediaEnded(object sender, RoutedEventArgs e)
//{
// _player2.Play();
//}
// 初始化播放器(MediaElement)
private MediaElement InitPlayer()
{
var player = new MediaElement
{
LoadedBehavior = MediaState.Manual,
UnloadedBehavior = MediaState.Manual,
Stretch = Stretch.UniformToFill
};
player.MediaOpened += Player_MediaOpened;
//player.MediaEnded += Player_MediaEnded;
return player;
}
// 準(zhǔn)備下一個(gè)播放器,并加載下一個(gè)素材甫恩,如果是最后一個(gè)素材逆济,則循環(huán)到第一個(gè)素材
private MediaElement PreparePlayer()
{
var player = InitPlayer();
player.Loaded += Player_Loaded;
if (++_idx == _videos.Length)
{
_idx = 0;
}
player.Source = new(_videos[_idx], UriKind.Absolute);
return player;
}
protected override void OnClosed(EventArgs e)
{
_player1.Stop();
_player1.Close();
_player2.Stop();
_player2.Close();
_timer.Dispose();
base.OnClosed(e);
}
}
20230809 添加:WPF 實(shí)現(xiàn)圖片/視頻自動輪播(VLC/定時(shí)器)