Я встроил libvlcsharp (используя GtkDrawingArea) в свое приложение GtkSharp (GTK 3) и хочу показать прозрачные наложения (надписи и изображения) поверх прозрачного видео (с помощью GtkOverlay).
Я столкнулся сдве проблемы делают это:
- Непрозрачность не применяется к просмотру видео
- Наложения, такие как метка, не являются прозрачными поверх видео
Пример отлично работает с веб-представлением (webkit2). Возможны ли прозрачные просмотры видео с прозрачными наложениями с помощью vlclib?
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
ОС: