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。所以我正在试验一些事件,看看我可以使用哪些事件来实现这个目标。

任何线索为什么?

PS此链接也无助于VLC播放器事件捕获

4

3 回答 3

4

我不认为你做错了什么。它似乎; 由于某种原因(即使在最新版本的 activeX 中),这些事件未实现(或未实现)。我已经读到这些事件在某些浏览器插件版本中要么太错误要么根本没有触发。

但是,它仍然有 3 个您可以信赖的有用且有效的事件。
Events Firing: playEventpauseEventEvents stopEvent
Not Firing: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();
        }
    }

不过,这些事件不会通知您任何流式传输错误。IMO,你唯一能做的就是;try-catch 你执行的地方vlc.addTarget(...)vlc.play(). 事先检查 URL 是否有效(也不要忘记"file:///"在最新版本的插件中包含文件路径的前面)。并且仅当捕获的错误与不存在的文件或无效路径等有关时才重新应用 videoURL(如您所愿)。

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

于 2013-02-01T17:57:50.320 回答
0

不应该是这样的:

vlc.MediaPlayerEncounteredError += new MediaPlayerEncounteredErrorEventHandler(vlc_MediaPlayerEncounteredError);
于 2013-01-31T15:46:07.000 回答
0

右键单击 VLC,从设计 → 属性 → 事件(Thunder 图标) →选择axVLCPlugin21_MediaPlayerendMediaPlayerEndReached

有关更多详细信息,请参见图片:

于 2019-05-17T01:28:10.940 回答