LINUX.ORG.RU

Сообщения Just_alex

 

QT блокирует поток gstreamer'a

Всем здравствуйте, возникла такая проблема. Работаю с gstreamer'ом, получаю поток по rtsp с IP камеры(rtspsrc) и вывожу на экран. Если компилировать в консоли обычным gcc строкой:

gcc tt.cpp -o tt `pkg-config --cflags --libs gstreamer-0.10`
все работает прекрасно.

Но! Если создаем проект в QT и компилируем тот же самый код, ничего в нем не меняя, то появляется окно вывода с 1 кадром, далее все глохнет.

Процесс гугления ничего не дал, или может не там искал.... Не может ли кто-нибудь помочь разобраться?

Собственно проект: module.pro:

#-------------------------------------------------
#
# Module for work with cam
#
#-------------------------------------------------

QT       += core gui

SOURCES += \
    main.cpp

TARGET = module
#TEMPLATE = app

INCLUDEPATH += /opt/gstreamer-sdk/lib/pkgconfig

CONFIG += link_pkgconfig
PKGCONFIG += gstreamer-0.10 gstreamer-interfaces-0.10 glib-2.0

QMAKE_CXXFLAGS += -fpermissive

main.cpp :


#include <gst/gst.h>
#include <glib.h>

typedef struct _CustomData {
  GstElement *pipeline;
  GstElement *source;
  GstElement *sink1;
  GstElement *sink2;
  GstElement *queue;
  GstElement *queue2;
  GstElement *depay;
  GstElement *mux;
  GstElement *decode;
  GstElement *videoscale;
  GstElement *colorspace;
} CustomData;

CustomData data;

static void pad_added_handler (GstElement *src, GstPad *new_pad,
                               CustomData *data)
{
    g_debug ("Signal: pad-added");
    GstPad *sink_pad = gst_element_get_static_pad (data->queue, "sink");

    GstPadLinkReturn ret = gst_pad_link (new_pad, sink_pad);

    if (GST_PAD_LINK_FAILED (ret))
        g_print (" link failed.\n");

    else
        g_print ( " Link succeeded \n");

    gst_object_unref (sink_pad);
}

int main(int argc, char *argv[])
{
    GstBus *bus;
    GstMessage *msg;
    GstPad *tee;
    GMainLoop *loop;
    guint bus_watch_id;

    gst_init (NULL, NULL);

    loop = g_main_loop_new (NULL, FALSE);

    data.pipeline   = gst_pipeline_new ("rtsp_capture");
    data.source     = gst_element_factory_make ("rtspsrc", NULL);
    data.depay      = gst_element_factory_make ("rtph264depay", NULL);

    data.queue2     = gst_element_factory_make ("queue2", NULL);
    data.decode     = gst_element_factory_make ("ffdec_h264", NULL);
    data.colorspace = gst_element_factory_make ("ffmpegcolorspace", NULL);
    data.sink1      = gst_element_factory_make ("ximagesink", NULL);

    data.queue      = gst_element_factory_make ("queue", NULL);
    data.mux        = gst_element_factory_make ("mpegtsmux", NULL);
    data.sink2      = gst_element_factory_make ("filesink", NULL);

    if (!data.pipeline  || !data.source     || !data.queue2 || !data.queue  ||
        !data.decode    || !data.colorspace || !data.sink1  || !data.mux    ||
        !data.sink2     || !data.depay   )
    {
        g_printerr ("Not all elements could be created.\n");
        //return -1;
    }

    g_object_set (data.source, "location", argv[1] , NULL);
    g_object_set (data.sink2,   "location", argv[2], NULL);
   
    bus = gst_pipeline_get_bus (GST_PIPELINE (data.pipeline));
    bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
    gst_object_unref (bus);

    gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.queue2, data.queue,
                      data.decode, data.colorspace, data.sink1, data.mux,
                      data.sink2, data.depay, NULL);

    g_signal_connect (data.source, "pad-added", G_CALLBACK (pad_added_handler), &data);
    gst_element_link (data.queue, data.depay);
    gst_element_link (data.depay, data.decode);
    gst_element_link (data.decode, data.colorspace);
    gst_element_link (data.colorspace,  data.sink1);

    g_print ("Running...\n");
    g_main_loop_run (loop);

    g_print ("Returned, stopping playback\n");
    gst_element_set_state (data.pipeline, GST_STATE_NULL);

    g_print ("Deleting pipeline\n");
    gst_object_unref (GST_OBJECT (data.pipeline));
    g_source_remove (bus_watch_id);
    g_main_loop_unref (loop);

    return 0;
}

тут есть ряд других элементов, но на них можно не обращать внимание, т.к. они для экспериментов и комбинирования между собой.

Запуск в консоли и вывод программы:

# ./modile rtsp://*** test.mp4
Running...
 Link succeeded
//закрываем окно 
Error: Output window was closed
Returned, stopping playback
Deleting pipeline

 ,

Just_alex
()

RSS подписка на новые темы