在Qt/QWidgets应用程序中的Gstreamer视频上方显示覆盖

在Qt/QWidgets应用程序中的Gstreamer视频上方显示覆盖,qt,overlay,gstreamer,Qt,Overlay,Gstreamer,我正在使用Qt和Gstreamer创建一个视频查看器。我正在使用以下简单代码来显示视频: GstElement* MainWindow::addVideo(QWidget* parent, const int& x, const int& y, const int& width, const int& height) { GstElement* pipeline = gst_pipeline_new ("xvoverlay"); GstE

我正在使用Qt和Gstreamer创建一个视频查看器。我正在使用以下简单代码来显示视频:

GstElement* MainWindow::addVideo(QWidget* parent, const int&  x, const int&  y, const int&  width, const int&  height) {

    GstElement* pipeline = gst_pipeline_new ("xvoverlay");
    GstElement* src = VideoView::makeElement("v4l2src", { {"device", "/dev/video0"} });
    GstElement* queue = gst_element_factory_make ("videoconvert", nullptr);
    GstElement* sink = gst_element_factory_make ("xvimagesink", nullptr);

    if (sink == nullptr)
        g_error ("Couldn't find a working video sink.");

    gst_bin_add_many (GST_BIN (pipeline), src, queue, sink, nullptr);
    gst_element_link_many (src, queue, sink, nullptr);

    QWidget* videoView = new VidView();
    videoView->setParent(parent);
    videoView->move(x, y);
    videoView->resize(width, height);
    videoView->setStyleSheet("background-color: red");
    videoView->show();

    gst_video_overlay_set_window_handle (GST_VIDEO_OVERLAY (sink), videoView->winId());
    gst_element_set_state (pipeline, GST_STATE_PLAYING);

    GstStateChangeReturn sret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
    if (sret == GST_STATE_CHANGE_FAILURE) {
        gst_element_set_state (pipeline, GST_STATE_NULL);
        gst_object_unref (pipeline);

        // Exit application
        QTimer::singleShot(0, QApplication::activeWindow(), SLOT(quit()));
    }

    return pipeline;
}
它工作得很好。但现在我需要在视频上方显示一些半透明的小部件(例如,在所有窗口上方有一个显示相机名称的标题栏或弹出窗口)。下面是我在显示部分覆盖视频的半透明黄色QWidget时得到的结果:

如您所见,在黄色小部件下显示的是视频视图背景,而不是视频

下面是用于创建第二个小部件的代码:

QWidget* test = new QWidget(m_mainContainer);
test->resize(100, 100);
test->move(150, 150);
test->setStyleSheet("background-color: #55ffff00;");
我怎样才能解决这个问题


注意:我不能使用glimagesink,因为它在显示多个视频时存在性能问题(该应用程序将显示多达8个4K视频)。

问题是Qt必须知道您的背景图像才能对其应用透明算法,正如您所经历的,Qt在OpenGL小部件中不知道它!一个简单的解决方案是依靠操作系统为您绘制半透明窗口,正如我在这里所做的(仅在Windows上测试,旧答案!):谢谢您的建议,但这对我在Ubuntu 16.04上不起作用。