0

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.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.