djdynamix Ответов: 1

Как управлять libvlc dotnet из другого окна в C# WPF


Пожалуйста, кто-нибудь может помочь? Я уже несколько дней чешу голову!

Я пытаюсь создать приложение, которое будет воспроизводить видео на втором экране, но с элементами управления Play/Pause/Stop и индикатором прогресса на основном мониторе.

Я использую библиотеку LibVLC с оболочкой vlc. dotnet.

Пожалуйста, извините за любой небрежный и скопированный/вставленный код, но в данный момент я все еще нахожусь на стадии "давайте попробуем".

Вот что у меня есть для кода за вторым окном экрана (в значительной степени поднятого непосредственно из примера кода vlc. dotnet):

public void Select(String ytURL, String ytControl)
        {
            if (ytURL == "")
            {
                ytURL = "http://download.blender.org/peach/bigbuckbunny_movies/big_buck_bunny_480p_h264.mov";
            }

            if (ytControl == "Play")
            {
                ytPlayVideo(ytURL);
            }
            else if (ytControl == "Stop")
            {
                // ???
            }
            else if (ytControl == "Pause")
            {
                // ???
            }
        }

private void ytPlayVideo(String playURL)
        {
            if (IntPtr.Size == 4)
            {
                // Use 32 bits library
                this.MyControl.MediaPlayer.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(Environment.CurrentDirectory, "libvlc-x86"));
            }
            else
            {
                // Use 64 bits library
                this.MyControl.MediaPlayer.VlcLibDirectory = new DirectoryInfo(System.IO.Path.Combine(Environment.CurrentDirectory, "libvlc-x64"));
            }

            var options = new string[]
            {
                // VLC options can be given here. Please refer to the VLC command line documentation.
                "--fullscreen"
            };

            this.MyControl.MediaPlayer.VlcMediaplayerOptions = options;

            // Load libvlc libraries and initializes stuff. It is important that the options (if you want to pass any) and lib directory are given before calling this method.
            this.MyControl.MediaPlayer.EndInit();
            this.MyControl.MediaPlayer.Play(playURL);
        }


А вот кодовый клип, который вызывает видеоокно из окна управления:

YTPlayer YTwin = new YTPlayer();
            int s2 = Screen.AllScreens.Count();
            if (s2 > 1)
            {
                Screen s1 = Screen.AllScreens[1];
                System.Drawing.Rectangle r1 = s1.WorkingArea;
                YTwin.WindowState = System.Windows.WindowState.Normal;
                YTwin.WindowStartupLocation = WindowStartupLocation.Manual;
                YTwin.Top = r1.Top;
                YTwin.Left = r1.Left;

                YTwin.Show();
            }
            YTwin.Select("", "Play");


Пока все хорошо. Это отлично воспроизводит видео, и я даже могу передавать ему различные видеосвязи, когда создается новое окно, но я ни за что на свете не могу понять, как передавать команды элементу управления VLC WPF на втором экране, когда он уже работает для паузы, остановки и т. д., или передавать данные обратно из видеоокна в окно контроллера для индикатора выполнения.

Это должно быть сделано с двумя отдельными окнами, так как вторичный экран должен быть максимизирован, в то время как поверхность управления на первичном должна быть увеличена.

Что я уже пробовал:

Я проверил довольно много тем здесь и на других форумах о том, как обращаться к элементам управления WPF в одном окне из другого и как передавать переменные между классами.

Например, создание пользовательского события и его отображение при создании экземпляра:

YTPlayer YTwin = new YTPlayer();
YTwin.RaiseCustomEvent += new EventHandler<CustomEventArgs>(YTwin_RaiseCustomEvent);


с:

public event EventHandler<CustomEventArgs> RaiseCustomEvent;


Проблема в том, что все, что я пытаюсь сделать, выдает ошибку с vlc.dotnet "Select" и говорит, что он не существует.

Мне нужно иметь возможность позвонить в YTPlayer.Select () from YTControl window while ytplayer window is open and running, without instantiating a new instance of YTPlayer.

Есть идеи?

1 Ответов

Рейтинг:
1

djdynamix

ОК... Я все понял! Я вел себя глупо. Хе-хе

Я вдруг понял (да!), что "Select" - это метод в коде ytplayer, а не функция в API.

Я просто должен был использовать:

foreach (Window window in System.Windows.Application.Current.Windows)
                    {
                        if (window.GetType() == typeof(YTPlayer))
{
...
}


в YTControl затем переместите туда все команды Play/Pause/Stop, непосредственно обращаясь к VLC API через элемент управления в окне YTPlayer WPF.