You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:27:00