LibVLCSharp开发问题:播放器窗口关闭后如何自动退出应用程序
问题原因
- 回调死锁:
SetExitHandler的回调执行在LibVLC内部非托管线程中,直接在回调内调用Environment.Exit会触发托管资源清理逻辑,而LibVLC本身会等待回调执行完成,二者互相等待形成死锁,导致应用无响应。 - API使用错误:
SetExitHandler是LibVLC全局退出时的触发回调,不是用来监听播放器窗口关闭事件的,不符合你的使用场景。 - 主线程逻辑错误:你当前用
Thread.Sleep阻塞主线程10秒,关闭窗口后主线程没有及时响应窗口关闭事件做资源清理,LibVLC仍尝试向已销毁的窗口输出视频,才会输出X server failure的错误日志。
修复方案
使用ManualResetEventSlim实现线程间退出信号通知,订阅专门的视频窗口关闭事件,由主线程统一处理资源释放和退出逻辑,修改后代码如下:
using System; using System.Threading; using LibVLCSharp.Shared; namespace ConsoleApp1 { class Program { // 退出信号量 private static readonly ManualResetEventSlim _exitSignal = new ManualResetEventSlim(false); static void Main(string[] args) { Core.Initialize(); using var libVlc = new LibVLC(); using var mediaPlayer = new MediaPlayer(libVlc); // 监听视频输出窗口关闭事件 mediaPlayer.VideoOutputClosed += (sender, e) => { // 通知主线程可以退出 _exitSignal.Set(); }; var media = new Media(libVlc, "v4l2:///dev/video0", FromType.FromLocation); media.AddOption(":v4l2-standard=ALL :live-caching=300"); mediaPlayer.Play(media); // 等待退出信号,替换原来的固定Sleep _exitSignal.Wait(); // 主动停止播放器,释放资源 mediaPlayer.Stop(); } } }
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

