Forel Leor
Forel Leor

Reputation: 1

Watching GStreamer RTSP stream in QT6 Widget

I want to watch RTSP Stream in a widget in QT6, but although I specify it at the bottom of the code, it opens in a separate window called "Direct3D11 renderer", not on that qt app widget. If I delete all the elements in between, such as queue videoconvert, it works as I want, but this time there is a lot of delay.

gst_init(nullptr, nullptr);
    
    GstElement *pipeline = gst_pipeline_new("video-pipeline");
    GstElement *rtspsrc = gst_element_factory_make("rtspsrc", "source");
    GstElement *queue = gst_element_factory_make("queue", "queue");
    GstElement *rtph264depay = gst_element_factory_make("rtph264depay", "depay");
    GstElement *h264parse = gst_element_factory_make("h264parse", "parse");
    GstElement *avdec_h264 = gst_element_factory_make("avdec_h264", "decoder");
    GstElement *videoconvert = gst_element_factory_make("videoconvert", "converter");
    GstElement *videoscale = gst_element_factory_make("videoscale", "scaler");
    GstElement *sink = gst_element_factory_make("autovideosink", "autovideosink");

    CHECK_ELEMENT(pipeline, "Pipeline");
    CHECK_ELEMENT(rtspsrc, "RTSP Source");
    CHECK_ELEMENT(queue, "Queue");
    CHECK_ELEMENT(rtph264depay, "RTP H264 Depayloader");
    CHECK_ELEMENT(h264parse, "H264 Parser");
    CHECK_ELEMENT(avdec_h264, "H264 Decoder");
    CHECK_ELEMENT(videoconvert, "Video Converter");
    CHECK_ELEMENT(videoscale, "Video Scaler");
    CHECK_ELEMENT(sink, "Video Sink");

    if (!pipeline || !rtspsrc || !queue || !rtph264depay || !h264parse || !avdec_h264 || !videoconvert || !videoscale || !sink) {
        return;
    }

    gst_bin_add_many(GST_BIN(pipeline), rtspsrc, queue, rtph264depay, h264parse, avdec_h264, videoconvert, videoscale, sink, nullptr);

    if (!gst_element_link_many(queue, rtph264depay, h264parse, avdec_h264, videoconvert, videoscale, sink, nullptr)) {
        gst_object_unref(pipeline);
        return;
    }

    g_object_set(G_OBJECT(rtspsrc), "location", "rtsp://127.0.0.1:8554/", nullptr);
    g_object_set(G_OBJECT(rtspsrc), "latency", 100, nullptr);

    g_signal_connect(rtspsrc, "pad-added", G_CALLBACK(+[](GstElement *src, GstPad *new_pad, gpointer data) {
                         GstElement *queue = GST_ELEMENT(data);
                         GstPad *sink_pad = gst_element_get_static_pad(queue, "sink");
                         if (gst_pad_is_linked(sink_pad)) {
                             g_object_unref(sink_pad);
                             return;
                         }
                         gst_pad_link(new_pad, sink_pad);
                         g_object_unref(sink_pad);
                     }), queue);

    WId windowId = ui->widgetCamera->winId();
    GstVideoOverlay *overlay = GST_VIDEO_OVERLAY(sink);
    gst_video_overlay_set_window_handle(overlay, static_cast<guintptr>(windowId));

    gst_element_set_state(pipeline, GST_STATE_PLAYING);

I want to see how to play RTSP Stream on qt widget.

Upvotes: 0

Views: 78

Answers (0)

Related Questions