C++ videoconvert元素中断udpsrc超时消息

C++ videoconvert元素中断udpsrc超时消息,c++,gstreamer,C++,Gstreamer,此代码每秒打印从udpsrc接收的超时。videoconvert元素被注释出管道。如果我取消注释,则消息将停止打印 // g++ gst_client.cpp `pkg-config --cflags gstreamer-1.0` `pkg-config --libs gstreamer-1.0` #include <gst/gst.h> #include <cstdlib> #include <cstdio> struct gstreamer_data

此代码每秒打印从udpsrc接收的超时。videoconvert元素被注释出管道。如果我取消注释,则消息将停止打印

// g++ gst_client.cpp `pkg-config --cflags gstreamer-1.0` `pkg-config --libs gstreamer-1.0`

#include <gst/gst.h>

#include <cstdlib>
#include <cstdio>

struct gstreamer_data {
    GstElement* pipeline;
    GstElement* udp_source;
    GstElement* rtp_decoder;
    GstElement* video_decoder;
    GstElement* video_converter;
    GstElement* fake_sink;
    GMainLoop* main_loop;
};

static void error_callback(GstBus* bus, GstMessage* message, gstreamer_data* data) {
    (void) bus;
    GError* err;
    gchar* debug_info;


    gst_message_parse_error(message, &err, &debug_info);
    g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(message->src), err->message);
    g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none");
    g_clear_error(&err);
    g_free(debug_info);

    g_main_loop_quit(data->main_loop);
}


static void element_callback(GstBus* bus, GstMessage* message, gpointer data) {
    const GstStructure* st = gst_message_get_structure(message);


    if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT) {
        if (gst_structure_has_name(st, "GstUDPSrcTimeout")) {
            printf("Timeout received from udpsrc\n");
        }
    }
}


int main() {
    gstreamer_data data;
    GstStateChangeReturn ret;
    GstBus* bus;


    gst_init(NULL, NULL);

    data.udp_source = gst_element_factory_make("udpsrc", "udp_source");
    g_object_set(G_OBJECT(data.udp_source),
        "port", 5000,
        "caps", gst_caps_new_empty_simple("application/x-rtp"),
        "timeout", 1000000000,
        NULL);

    data.rtp_decoder = gst_element_factory_make("rtph264depay", "rtp_decoder");

    data.video_decoder = gst_element_factory_make("avdec_h264", "video_decoder");

    data.video_converter = gst_element_factory_make("videoconvert", "video_converter");

    data.fake_sink = gst_element_factory_make("fakesink", "fake_sink");

    data.pipeline = gst_pipeline_new("pipeline");

    if (
        !data.pipeline ||
        !data.udp_source ||
        !data.rtp_decoder ||
        !data.video_decoder ||
        !data.video_converter ||
        !data.fake_sink
        )
        {
            g_printerr("Not all elements could be created.\n");
            exit(-1);
    }

    gst_bin_add_many(
        GST_BIN(data.pipeline),
        data.udp_source,
        data.rtp_decoder,
        data.video_decoder,
        //data.video_converter,
        data.fake_sink,
        NULL);

    if (gst_element_link_many(
        data.udp_source,
        data.rtp_decoder,
        data.video_decoder,
        //data.video_converter,
        data.fake_sink,
        NULL) != TRUE)
        {
            g_printerr("Elements could not be linked.\n");
            gst_object_unref(data.pipeline);
            exit(-1);
        }

    bus = gst_element_get_bus(data.pipeline);
    gst_bus_add_signal_watch(bus);
    g_signal_connect(G_OBJECT(bus), "message::error", (GCallback) error_callback, &data);
    g_signal_connect(G_OBJECT(bus), "message::element", (GCallback) element_callback, &data);
    gst_object_unref(bus);

    ret = gst_element_set_state(data.pipeline, GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE) {
        g_printerr("Unable to set the pipeline to the playing state.\n");
        gst_object_unref(data.pipeline);
        exit(-1);
    }

    data.main_loop = g_main_loop_new(NULL, FALSE);
    g_main_loop_run(data.main_loop);

    return 0;
}

我已经尝试过将调试级别设置得更高,但我看不到任何原因。videoconvert元素有什么特别之处吗?

也许您毕竟是在向该udpsrc发送数据

我已经确认,如果不评论这两行,我确实会得到预期的日志消息