Reputation: 1
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