.NET Core 3.1 WinForm嵌入Lib.VLC如何实现视频循环、定时关闭及停止后台播放
解决方案
问题根源说明
你遇到的两个问题核心原因分别是:
- 关闭窗体后仍后台播放:VLC相关的
LibVLC、MediaPlayer都是非托管资源,局部变量在窗体关闭时不会被主动释放,后台播放线程会继续运行 - 定时关闭需求:可以通过WinForm原生的UI计时器实现,避免跨线程异常
实现步骤
第一步:声明类级别成员
将VLC相关对象和计时器改为窗体类的全局成员,不要作为局部变量声明,方便后续资源释放:
// 在你的窗体类内部声明 private LibVLC _libvlc; private MediaPlayer _mediaPlayer; private VideoView _videoView; private System.Windows.Forms.Timer _autoStopTimer;
第二步:注册窗体关闭事件释放资源
在窗体的FormClosing事件中主动停止播放、释放所有非托管资源,彻底关闭后台播放:
private void PlayerForm_FormClosing(object sender, FormClosingEventArgs e) { // 停止播放并释放播放器资源 if (_mediaPlayer != null) { if (_mediaPlayer.IsPlaying) { _mediaPlayer.Stop(); } _mediaPlayer.Dispose(); } // 释放LibVLC核心资源 _libvlc?.Dispose(); // 释放计时器资源 _autoStopTimer?.Dispose(); }
注意:需要提前在窗体构造函数或者属性面板中绑定FormClosing事件到上述方法
第三步:修改初始化逻辑,添加定时关闭功能
将原来的初始化逻辑替换为下面的代码,按需修改计时时长即可实现自动关闭:
private void PlayerForm_Load(object sender, EventArgs e) { Core.Initialize(); _libvlc = new LibVLC(); // 初始化播放器控件 _videoView = new VideoView(); _mediaPlayer = new MediaPlayer(_libvlc); _videoView.MediaPlayer = _mediaPlayer; _videoView.Dock = DockStyle.Fill; Controls.Add(_videoView); // 加载播放资源 var uri = new Uri(@"C:\vid.3gp"); var media = new Media(_libvlc, uri, ":input-repeat=65535"); _mediaPlayer.Play(media); // Media对象加载完成后即可释放,不影响播放 media.Dispose(); // 全屏设置 this.FormBorderStyle = FormBorderStyle.None; this.Size = Screen.PrimaryScreen.Bounds.Size; this.Location = Screen.PrimaryScreen.Bounds.Location; // 初始化自动关闭计时器,示例为播放30分钟后自动关闭 _autoStopTimer = new System.Windows.Forms.Timer(); // 计时单位为毫秒,可按需修改:时长=分钟数*60*1000 _autoStopTimer.Interval = 30 * 60 * 1000; _autoStopTimer.Tick += (s, args) => { // 关闭窗体会自动触发FormClosing事件的资源释放逻辑 this.Close(); }; _autoStopTimer.Start(); }
内容的提问来源于stack exchange,提问作者Malik Mehmood
相关产品推荐
相关产品推荐

