(GTK3 + libvlc) Наложения видео отображаются неправильно, а непрозрачность видео не применяется - PullRequest
0 голосов
/ 14 октября 2019

Я встроил libvlcsharp (используя GtkDrawingArea) в свое приложение GtkSharp (GTK 3) и хочу показать прозрачные наложения (надписи и изображения) поверх прозрачного видео (с помощью GtkOverlay).

Я столкнулся сдве проблемы делают это:

  • Непрозрачность не применяется к просмотру видео
  • Наложения, такие как метка, не являются прозрачными поверх видео

Пример отлично работает с веб-представлением (webkit2). Возможны ли прозрачные просмотры видео с прозрачными наложениями с помощью vlclib?

video with overlay text

Program.cs:

        [STAThread]
        public static void Main(string[] args)
        {
            Core.Initialize();
            Application.Init();
            var app = new Application("org.GtkTest4.GtkTest4", GLib.ApplicationFlags.None);
            app.Register(GLib.Cancellable.Current);

            using (var libvlc = new LibVLC())
            using (var mediaPlayer = new MediaPlayer(libvlc))
            {
                var window = CreateWindow();
                app.AddWindow(window);
                window.StyleContext.AddProvider(Styles.GetProvider(), UInt32.MaxValue);
                window.StyleContext.AddClass("red-background");

                var videoView = new VideoView() { MediaPlayer = mediaPlayer, Valign = Align.Center, Halign = Align.Center };
                var label = new Label { Text = "Lorem Ipsum Dolor", Valign = Align.Center, Halign = Align.Fill };
                var overlay = new Overlay { Valign = Align.Fill, Halign = Align.Fill };

                videoView.SetSizeRequest(500, 400);
                videoView.Opacity = 0.5;

                overlay.Add(videoView);
                overlay.AddOverlay(label);

                window.Add(overlay);
                window.ShowAll();

                videoView.MediaPlayer.Play(new Media(libvlc, "video.mp4"));
                Application.Run();
            }
        }

VideoView.cs:

    public class VideoView : DrawingArea, IVideoView
    {
        private MediaPlayer _mediaPlayer;

        public VideoView()
        {
            Realized += (s, e) => Attach();
        }

        [DllImport("libgdk-3.so.0", CallingConvention = CallingConvention.Cdecl)]
        internal static extern uint gdk_x11_window_get_xid(IntPtr gdkWindow);

        public MediaPlayer MediaPlayer
        {
            get => _mediaPlayer;
            set
            {
                _mediaPlayer = value;
                Attach();
            }
        }

        void Attach()
        {
            if (!IsRealized || _mediaPlayer == null)
            {
                return;
            }

            MediaPlayer.XWindow = gdk_x11_window_get_xid(Window.Handle);
        }

        void Detach()
        {
            if (!IsRealized || _mediaPlayer == null)
            {
                return;
            }

            MediaPlayer.XWindow = 0;
        }

        public void Dispose()
        {
            Detach();
            base.Dispose();
        }
    }

вывод консоли vlclib:

libEGL warning: DRI2: failed to authenticate
Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory

Используемые инструменты:

  • .NET Core 3.0.100
  • GtkSharp 3.22.24
  • LibVLCSharp 3.2.3

ОС:

  • Ubuntu 18.04.3 LTS
...