Отобразить наложение над видео Gstreamer в приложении Qt / QWidgets - PullRequest
0 голосов
/ 23 октября 2019

Я использую 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, частично перекрывающий видео:

enter image description here

Как видно, под желтым виджетом вид видеоотображается фон, а не видео.

Вот код, использованный для создания этого второго виджета:

QWidget* test = new QWidget(m_mainContainer);
test->resize(100, 100);
test->move(150, 150);
test->setStyleSheet("background-color: #55ffff00;");

Как это исправить?

Примечание: я могу 't не используйте glimagesink, поскольку у него проблемы с производительностью при показе нескольких видео (приложение будет отображать до 8 видео 4K).

...