ActiveX VLC播放器事件无法工作。

8

我已将ActiveX VLC插件集成到WPF应用程序中。VLC插件工作正常。

AxVLCPlugin   vlc = new AxVLCPlugin();
vlc.MediaPlayerEncounteredError += vlc_MediaPlayerEncounteredError;
vlc.MediaPlayerOpening += vlc_MediaPlayerOpening;
vlc.MediaPlayerBuffering += vlc_MediaPlayerBuffering;
vlc.MediaPlayerEndReached += vlc_MediaPlayerEndReached;
 //
// Other code 
// like    windowsFormsHost1.Child = vlc; and etc
vlc.addTarget(videoURL, null, AXVLC.VLCPlaylistMode.VLCPlayListReplace, 1);
vlc.play();

但是不知道为什么VLC的所有事件都没有起作用。

我的意思是这些事件:

vlc.MediaPlayerEncounteredError += vlc_MediaPlayerEncounteredError;
vlc.MediaPlayerOpening += vlc_MediaPlayerOpening;
vlc.MediaPlayerBuffering += vlc_MediaPlayerBuffering;
vlc.MediaPlayerEndReached += vlc_MediaPlayerEndReached;

 void vlc_MediaPlayerEndReached(object sender, EventArgs e)
        {
            Debug.WriteLine("[P] - StreamingVideo -  END REACHED + " + DateTime.Now);
        }

        void vlc_MediaPlayerBuffering(object sender, DVLCEvents_MediaPlayerBufferingEvent e)
        {
            Debug.WriteLine("[P] - StreamingVideo -  BUFFERING + " + DateTime.Now);
        }

        void vlc_MediaPlayerOpening(object sender, EventArgs e)
        {
            Debug.WriteLine("[P] - StreamingVideo -  OPENING + " + DateTime.Now);
        }

        void vlc_MediaPlayerEncounteredError(object sender, EventArgs e)
        {
            Debug.WriteLine("[P] - StreamingVideo -  ERROR + " + DateTime.Now);
        }

他们没有触发。(当然,我在这些方法中设置了断点。)
我真正需要的是捕获流错误并重新应用videoURL另一次。因此,我正在尝试使用事件来确定哪个事件可以达到这个目标。
有任何线索为什么会这样吗?
P.S. 这个链接也没有帮助 VLC player event catch
3个回答

4
我认为你没有做错任何事情。看起来,这些事件由于某种原因(即使在最新版本的ActiveX中)未被实现或未完成。我已经阅读到,这些事件在某些浏览器插件版本中要么太有缺陷,要么根本不触发。
然而,它仍然有3个有用且可用的事件:
触发的事件:playEventpauseEventstopEvent
未触发的事件:所有以MediaPlayer开头的事件...
无论如何,下面的代码适用于我提到的事件:
    AxVLCPlugin vlc;
    public MainWindow()
    {
        InitializeComponent();

        vlc = new AxVLCPlugin();
        windowsFormsHost1.Child = vlc;

        vlc.pauseEvent += new EventHandler(vlc_pauseEvent);
        vlc.playEvent += new EventHandler(vlc_playEvent);
        vlc.stopEvent += new EventHandler(vlc_stopEvent);
    }

    void vlc_playEvent(object sender, EventArgs e)
    {
        Debug.WriteLine("playEvent fired!");
    }

    void vlc_pauseEvent(object sender, EventArgs e)
    {
        Debug.WriteLine("pauseEvent fired!");
    }

    void vlc_stopEvent(object sender, EventArgs e)
    {
        Debug.WriteLine("stopEvent fired!");
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.ShowDialog();
        if (ofd.FileName != "")
        {
            Debug.WriteLine(ofd.FileName);
            vlc.addTarget("file:///" + ofd.FileName, null, AXVLC.VLCPlaylistMode.VLCPlayListReplaceAndGo, 0);
            vlc.play();
        }
    }

然而,这些事件不会告诉您任何流媒体错误。我认为,您唯一能做的就是; 在执行vlc.addTarget(...)vlc.play()时使用try-catch。先检查URL是否有效(还要记得在最新版本的插件中在文件路径前面加上"file:///")。如果捕获到的错误不是关于不存在的文件或无效的路径等问题,则重新应用videoURL(根据您的喜好)。

或者,您可以尝试其他包装器/自定义库:


我认为你现在是正确的,也许他们会在以后的版本中实现这些事件在VLC ActiveX中。所以你赢了+++。 - NoWar
同时,看起来VLC ActiveX也是一个已经停止维护的项目,我猜测这可能是因为H.264标准取代了它的领导地位。 - NoWar
能否将正在运行的VLC实例绑定到此ActiveX控件? - alizx
不,我不这么认为。 - Onur Yıldırım

0

这不应该是像这样的吗:

vlc.MediaPlayerEncounteredError += new MediaPlayerEncounteredErrorEventHandler(vlc_MediaPlayerEncounteredError);

0

在Design视图下,从“属性”→“事件”(雷电符号)→ 在MediaPlayerEndReached中选择axVLCPlugin21_MediaPlayerend

详情请参见下图:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接