Я использую 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;");
Как это исправить?
Примечание: я могу 't не используйте glimagesink, поскольку у него проблемы с производительностью при показе нескольких видео (приложение будет отображать до 8 видео 4K).