c - g_object_unref : assertion 'G_IS_OBJECT (object)' failed

标签 c gstreamer glib

我正在尝试使用 C 通过 Gstreamer 实现视频播放器。我可以正确运行我的程序,但出现错误: (drmDemo:871): GLib-GObject-CRITICAL **: 14:14:57.520: g_object_unref: 断言 'G_IS_OBJECT (object)' 失败。 这是我的代码:

static void linkElements(GstElement* element, GstPad* sourcePad, gpointer sinkElement)
{
    GstPad* sinkPad=gst_element_get_static_pad((GstElement*)sinkElement, "sink");
    gst_pad_link(sourcePad,sinkPad);
    gst_object_unref(sinkPad);
}

int MyTest(int argc, char** argv)
{
    GstElement *pipeline;
    GstElement *source, *demuxer, *queue, *parser, *decoder, *converter, *sink;

    GstBus *bus;
    GstMessage *msg;
    GstStateChangeReturn ret;
    gboolean terminate = FALSE;
    int retval = 0;

    /* Initialize GStreamer */
    gst_init(&argc, &argv);

    /* Create the elements */
    source = gst_element_factory_make("filesrc", "file-source");
    demuxer = gst_element_factory_make("qtdemux", "demuxer");
    queue = gst_element_factory_make("queue", "queue");
    parser = gst_element_factory_make("h264parse", "parser");
    decoder = gst_element_factory_make("mppvideodec", "decoder");
    converter = gst_element_factory_make("videoconvert", "converter");
    sink = gst_element_factory_make("waylandsink", "sink");

    /* Create the empty pipeline */
    pipeline = gst_pipeline_new("test-pipeline");

    /* Check creation */
    if (!pipeline || !source || !demuxer || !queue || !parser || !decoder || !converter || !sink) {
        g_printerr("Not all elements could be created.\n");
        goto out_return;
    }

    /* Set the location of the input file */
    g_object_set(G_OBJECT(source), "location", "13850_h264.mp4", NULL);

    /* Build the pipeline */
    gst_bin_add_many(GST_BIN(pipeline), source, demuxer, queue, parser, decoder, converter, sink, NULL);
    if (!gst_element_link(source, demuxer)) {
        g_printerr("Source and demuxer could not be linked.\n");
        retval = -1;
        goto out_unref;
    }
    if (!gst_element_link(queue, parser)) {
        g_printerr("Queue and parser could not be linked.\n");
        retval = -2;
        goto out_unref;
    }
    if (!gst_element_link(parser, decoder)) {
        g_printerr("Parser and decoder could not be linked.\n");
        retval = -3;
        goto out_unref;
    }
    if (!gst_element_link(decoder, converter)) {
        g_printerr("Decoder and converter could not be linked.\n");
        retval = -4;
        goto out_unref;
    }

    /* Manually connect the demuxer to the queue */
    g_signal_connect(demuxer, "pad-added", G_CALLBACK(linkElements), queue);

    if (!gst_element_link(converter, sink)) {
        g_printerr("Converter and sink could not be linked.\n");
        retval = -5;
        goto out_unref;
    }

    /* Set the pipeline to "playing" state */
    ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);
    if (ret == GST_STATE_CHANGE_FAILURE) {
        g_printerr("Unable to set the pipeline to the playing state.\n");
        retval = -6;
        goto out_unref;
    }

    /* Bus */
    bus = gst_element_get_bus(pipeline);
    msg = gst_bus_timed_pop_filtered(
        bus, GST_CLOCK_TIME_NONE,
        GST_MESSAGE_ERROR | GST_MESSAGE_EOS
    );

    /* Parse message */
    if (msg != NULL)
    {
        GError *err;
        gchar *debug_info;

        switch (GST_MESSAGE_TYPE(msg))
        {
            case GST_MESSAGE_ERROR:
                gst_message_parse_error(msg, &err, &debug_info);

                g_printerr("Error received from element %s: %s\n",
                    GST_OBJECT_NAME (msg->src), err->message
                );
                g_printerr("Debugging information: %s\n",
                    debug_info ? debug_info : "none"
                );
                
                g_clear_error(&err);
                g_free(debug_info);
                break;
            case GST_MESSAGE_EOS:
                g_print("End-Of-Stream reached.\n");
                break;
            default:
                g_printerr("Unexpected message received.\n");
                break;
        }

        gst_object_unref(msg);
    }

printf("before unref\n");
    gst_object_unref(bus);
printf("unref bus\n");
    gst_element_set_state(pipeline, GST_STATE_NULL);
printf("set null\n");
out_unref:
    gst_object_unref(pipeline);
printf("unref pipeline\n");
out_return:
    return retval;
}

当我运行我的应用程序时,它显示:

mpp[871]: mpp_rt: NOT found ion allocator
mpp[871]: mpp_rt: found drm allocator
mpp[871]: mpp_info: mpp version: unknown mpp version for missing VCS info
mpp[871]: h264d_api: is_avcC=1
mpp[871]: hal_h264d_vdpu34x: control info: fmt 7, w 640, h 480
mpp[871]: mpp_buf_slot: set frame info: w  640 h  480 hor  640 ver  480
mpp[871]: mpp_dec: setting default w  640 h  480 h_str  640 v_str  480
End-Of-Stream reached.

(drmDemo:871): GLib-GObject-CRITICAL **: 14:14:57.520: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
before unref
unref bus
set null
unref pipeline

是否是g_signal_connect引起的unref异常?或者当我取消引用这些元素时我犯了一些错误。非常感谢任何答案或评论。

最佳答案

对于 GstMessage,请使用 gst_message_unref() 而不是 gst_object_unref()

参见:https://gstreamer.freedesktop.org/documentation/gstreamer/gstmessage.html?gi-language=c#gst_message_unref .

关于c - g_object_unref : assertion 'G_IS_OBJECT (object)' failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75530422/

相关文章:

c - 在 C 中 float 和加倍

c - 在文件中查找单词无法正常工作

gstreamer - 在 Gstreamer 中通过 RTSP 传输数据

c - 将结构传递给回调函数

c - 如何将 ZeroMQ 套接字集成到 glib 主循环中?

linux - 安装 glib : error: redefinition of typedef 'GListStore'

c++ - Linux 程序是否像 Windows 程序一样可移植?

C函数参数优化: (MyStruct const * const myStruct) vs.(MyStruct const myStruct)

gstreamer - 将 Gstreamer SDK 教程 (gstreamer 0.1) 移植到 gstreamer 1.0

Android Gstreamer SDK教程报错