在Qt/QWidgets应用程序中的Gstreamer视频上方显示覆盖
我正在使用Qt和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
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上不起作用。