0

我将 libvlcsharp(使用 GtkDrawingArea)嵌入到我的 GtkSharp(GTK 3)应用程序中,我想在透明视频(使用 GtkOverlay)上显示透明覆盖(标签和图像)。

我遇到了两个问题:

  • 不透明度不适用于视频视图
  • 像标签这样的叠加层在视频顶部不透明

该示例适用于 webview (webkit2)。使用 vlclib 甚至可以实现带有透明覆盖的透明视频视图吗?

带有叠加文字的视频

程序.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();
            }
        }

视频视图.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 核心 3.0.100
  • GtkSharp 3.22.24
  • LibVLCSharp 3.2.3

操作系统:

  • Ubuntu 18.04.3 LTS
4

0 回答 0