Просмотр потока GStreamer RTSP в виджете QT6C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Просмотр потока GStreamer RTSP в виджете QT6

Сообщение Anonymous »

Я хочу смотреть поток RTSP в виджете в QT6, но хотя я указываю это в нижней части кода, он открывается в отдельном окне под названием «Рендеринг Direct3D11», а не в этом виджете приложения qt. Если я удалю все промежуточные элементы, например очередь видеоконвертации, все будет работать так, как я хочу, но на этот раз будет большая задержка.

Код: Выделить всё

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(windowId));

gst_element_set_state(pipeline, GST_STATE_PLAYING);
Я хочу посмотреть, как воспроизводить поток RTSP на виджете qt.

Подробнее здесь: https://stackoverflow.com/questions/792 ... qt6-widget
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»