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
相关产品推荐
相关产品推荐

