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

LibVLCSharp中EncounteredError事件sender非VLCPlayer,如何获取播放器?

问题描述

我尝试捕获RTSP流的错误,以此重启多个播放器和录制器。当前实现代码如下:

using VLCPlayer = LibVLCSharp.Shared.MediaPlayer;

// Create player 
LibVLC _libVLC = new LibVLC();
VLCPlayer vlcPlayer = new VLCPlayer(_libVLC);
vlcPlayer.EncounteredError += HandleFailedPlayback;
void HandleFailedPlayback(object sender, EventArgs e)
{
   Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => {
     SLog.AppendText($"{DateTime.Now} - Fail event detected ... \n");
  });
}

但事件处理方法中的object sender实际是MediaManager而非VLCPlayer,我期望sender是VLCPlayer,请问如何获取对应的播放器以执行启停操作?


解决方案

方法1:通过闭包直接捕获播放器实例

在订阅EncounteredError事件时,利用闭包直接绑定当前的vlcPlayer实例,无需依赖sender参数:

LibVLC _libVLC = new LibVLC();
VLCPlayer vlcPlayer = new VLCPlayer(_libVLC);

// 直接在事件订阅中使用闭包捕获播放器
vlcPlayer.EncounteredError += (s, e) => 
{
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => {
        SLog.AppendText($"{DateTime.Now} - Fail event detected ... \n");
        // 直接操作捕获的vlcPlayer实例
        vlcPlayer.Stop();
        // 添加重启逻辑,例如重新加载媒体并播放
        // var media = new Media(_libVLC, "rtsp://your-stream-url");
        // vlcPlayer.Media = media;
        // vlcPlayer.Play();
    });
};

方法2:从MediaManager实例中获取关联播放器

如果MediaManager类提供了关联MediaPlayer的属性(比如Player),可以将sender转换为MediaManager后获取播放器:

void HandleFailedPlayback(object sender, EventArgs e)
{
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => {
        SLog.AppendText($"{DateTime.Now} - Fail event detected ... \n");
        
        // 转换sender类型并获取播放器
        if (sender is MediaManager mediaManager)
        {
            var targetPlayer = mediaManager.Player as VLCPlayer;
            if (targetPlayer != null)
            {
                // 执行启停及重启操作
                targetPlayer.Stop();
                // 补充重启逻辑
            }
        }
    });
}

方法3:自定义事件传递播放器实例

如果前两种方法不适用,可以封装自定义事件,在触发错误时主动传递播放器实例:

// 自定义事件参数类,用于传递播放器实例
public class PlayerErrorEventArgs : EventArgs
{
    public VLCPlayer Player { get; }
    public PlayerErrorEventArgs(VLCPlayer player) => Player = player;
}

// 订阅原生错误事件,触发自定义事件
LibVLC _libVLC = new LibVLC();
VLCPlayer vlcPlayer = new VLCPlayer(_libVLC);
vlcPlayer.EncounteredError += (s, e) => OnPlayerError(new PlayerErrorEventArgs(vlcPlayer));

// 自定义事件处理方法
private void OnPlayerError(PlayerErrorEventArgs e)
{
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, () => {
        SLog.AppendText($"{DateTime.Now} - Fail event detected ... \n");
        // 通过事件参数获取对应的播放器
        e.Player.Stop();
        // 添加重启逻辑
    });
}

内容的提问来源于stack exchange,提问作者skvo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:20:21