Udp 带tsdemux的GStreamer不呼叫pad附加信号
我有一个属于gstreamer的问题 因此,首先我尝试编译以下内容: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附加信号。我没有得到任何错误。所以我觉得一切都很好。但是信号没有
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