Всем здравствуйте, возникла такая проблема. Работаю с 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