Udp 带tsdemux的GStreamer不呼叫pad附加信号

Udp 带tsdemux的GStreamer不呼叫pad附加信号,udp,gstreamer,Udp,Gstreamer,我有一个属于gstreamer的问题 因此,首先我尝试编译以下内容: gst-launch-1.0-v udpsrc多播组=224.10.10.10端口=8008!tsdemux!h264parse!avdec_h264!d3dvideosink sync=false 它工作并显示正确的视频 但如果我尝试在应用程序中执行此操作,则什么也不会发生。我认为问题在于事件linkElements没有被调用。因此,它来自tsdemux的pad附加信号。我没有得到任何错误。所以我觉得一切都很好。但是信号没有

我有一个属于gstreamer的问题

因此,首先我尝试编译以下内容:

gst-launch-1.0-v udpsrc多播组=224.10.10.10端口=8008!tsdemux!h264parse!avdec_h264!d3dvideosink sync=false

它工作并显示正确的视频

但如果我尝试在应用程序中执行此操作,则什么也不会发生。我认为问题在于事件linkElements没有被调用。因此,它来自tsdemux的pad附加信号。我没有得到任何错误。所以我觉得一切都很好。但是信号没有被调用

你能告诉我我做错了什么吗

#include <QCoreApplication>

#include <gst/gst.h>

#include <iostream>

typedef struct
{
  GstElement * pipeline = nullptr;
  GstElement * source = nullptr;
  GstElement * tsDemux = nullptr;
  GstElement * h264parse = nullptr;
  GstElement * avdecH264 = nullptr;
  GstElement * sinkVideo = nullptr;
} VideoData;

static void linkElements(GstElement* element,GstPad* sourcePad, gpointer sinkElement);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    GMainLoop *loop;

    if (!g_thread_supported ())
        g_thread_init (nullptr);

    gst_init ( 0, 0 );

    loop = g_main_loop_new (nullptr, FALSE);

    VideoData m_data;

    m_data.pipeline = gst_pipeline_new ("player");
    m_data.source = gst_element_factory_make ("udpsrc", nullptr);
    m_data.tsDemux = gst_element_factory_make("tsdemux", nullptr);
    m_data.h264parse = gst_element_factory_make("h264parse", nullptr);
    m_data.avdecH264 = gst_element_factory_make("avdec_h264", nullptr);
    m_data.sinkVideo = gst_element_factory_make("d3dvideosink", nullptr);

    g_object_set(G_OBJECT (m_data.source), "multicast-group", "224.10.10.10", nullptr);
    g_object_set(G_OBJECT (m_data.source), "port", 8008, nullptr);
    g_object_set(G_OBJECT (m_data.sinkVideo), "sync", false, nullptr);

    gst_bin_add_many(GST_BIN(m_data.pipeline), m_data.source, m_data.tsDemux, m_data.h264parse, m_data.avdecH264, m_data.sinkVideo, nullptr);

    std::cout << "Start linking all elements..." << std::endl;

    if ( gst_element_link (m_data.source, m_data.tsDemux ) != TRUE )
    {
        std::cout << "1: Element could not be linked." << std::endl;
        gst_object_unref (m_data.pipeline);
        return 0;
    }

    g_signal_connect(m_data.tsDemux, "pad-added", G_CALLBACK(linkElements), nullptr); //nullptr //&m_data

    if ( gst_element_link_many(m_data.h264parse, m_data.avdecH264, m_data.sinkVideo, nullptr) != TRUE )
    {
        std::cout << "2: Element could not be linked." << std::endl;
        gst_object_unref (m_data.pipeline);
        return 0;
    }

    std::cout << "Linked all elements!" << std::endl;

    GstStateChangeReturn ret = gst_element_set_state(m_data.sinkVideo, GST_STATE_READY);

    ret = gst_element_set_state (m_data.pipeline, GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE)
    {
        std::cout << "Unable to set the pipeline to the playing state." << std::endl;
        gst_object_unref (m_data.pipeline);
        return 0;
    }

    g_main_loop_run (loop);

    return a.exec();
}

static void linkElements(GstElement* element,GstPad* sourcePad, gpointer sinkElement){
    std::cout << "Got here linkElements!" << std::endl;
    GstPad* sinkPad=gst_element_get_static_pad((GstElement*)sinkElement,"sink");
    gst_pad_link(sourcePad,sinkPad);
    gst_object_unref(sinkPad);
}
#包括
#包括
#包括
类型定义结构
{
GstElement*管道=nullptr;
GstElement*source=nullptr;
GstElement*tsDemux=nullptr;
GstElement*h264parse=nullptr;
GstElement*avdecH264=nullptr;
GstElement*sinkVideo=nullptr;
}视频数据;
静态无效链接元素(GstElement*元素、GstPad*源板、gpointer元素);
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
GMainLoop*循环;
如果(!g_thread_supported())
g_thread_init(nullptr);
gst_init(0,0);
loop=g_main_loop_new(nullptr,FALSE);
视频数据m_数据;
m_data.pipeline=gst_pipeline_new(“玩家”);
m_data.source=gst_元素_工厂制造(“udpsrc”,nullptr);
m_data.tsDemux=gst_元素_工厂制造(“tsDemux”,nullptr);
m_data.h264parse=gst_元素_工厂制造(“h264parse”,nullptr);
m_data.avdecH264=商品及服务税元素工厂制造(“avdec_h264”,nullptr);
m_data.sinkVideo=gst_元素_工厂制造(“d3dvideosink”,nullptr);
g_object_set(g_object(m_data.source),“多播组”,“224.10.10.10”,nullptr);
g_对象集(g_对象(m_数据源),“端口”,8008,空PTR);
g_对象集(g_对象(m_data.sinkVideo),“同步”,假,空PTR);
gst_bin_add_many(gst_bin(m_data.pipeline)、m_data.source、m_data.tsDemux、m_data.h264parse、m_data.avdecH264、m_data.sinkVideo、nullptr);
标准::cout