【问题标题】:No pad-added signal callback in my gstreamer我的 gstreamer 中没有填充信号回调
【发布时间】:2018-06-27 02:36:51
【问题描述】:

我正在尝试在收到“填充添加”回调时构建管道。 当我运行 udpsink 管道时,我没有收到任何回调,而是收到 GST_MESSAGE_ERROR,并显示以下消息:内部数据流错误。

这是我的管道:

gst-launch-1.0 -vvv udpsrc port=5004 ! application/x-rtp, payload=96 ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink sync=false

查看 Gstreamer 教程 3 为此编写代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <gst/gst.h>
#include <sys/time.h>

#define VIDEO_CAPS "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264"

static void cb_new_pad(GstElement *element, GstPad *pad, gpointer data)
{
    gchar *name;
    name = gst_pad_get_name(pad);
    printf("A new pad %s is created\n", name);
    g_free(name);

}


gboolean bus_callback(GstBus *bus, GstMessage *msg, gpointer data)
{

    switch(GST_MESSAGE_TYPE(msg))
    {
        case GST_MESSAGE_EOS:
            break;

        case GST_MESSAGE_ERROR:
            {
                    GError *err;
                gchar *debug_info;
                    gst_message_parse_error (msg, &err, &debug_info);
                    printf("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message);
                    break;
            }

        case GST_MESSAGE_WARNING:
                {
                        GError *err;
                        gchar *debug_info;
                        gst_message_parse_warning(msg, &err, &debug_info);
                    printf("Warning received from element %s: %s", GST_OBJECT_NAME (msg->src), err->message);
                    break;
            }


        default:
            break;

    }
    return TRUE;
}

int main(int argc, char *argv[])
{
    GstCaps *caps;
    GstElement *udpsrc; 
    GstElement *videodepay, *videoparse;
    GstElement *videosink, *videodec;
    GstElement *pipeline;
    GstBus *bus = NULL;
    guint bus_watch_id = 0;
    GMainLoop *g_main_loop = NULL;

    //Initialize GStreamer
    gst_init(NULL, NULL);

    //the pipeline to hold everything
    pipeline = gst_pipeline_new(NULL);
    g_assert(pipeline);


    //udp source
    udpsrc = gst_element_factory_make("udpsrc", "rtpsrc");
    g_assert(udpsrc);
    g_object_set(udpsrc,"port", 5004, NULL);
    g_object_set(udpsrc,"timeout", (guint64)3000000000UL, NULL);


    //set caps
    caps = gst_caps_from_string(VIDEO_CAPS);
    g_object_set(udpsrc, "caps", caps, NULL);
    gst_caps_unref(caps);

    //depayloading and decoding

    videodepay = gst_element_factory_make("rtph264depay", "depay");
    g_assert(videodepay);

    videoparse = gst_element_factory_make("h264parse", "parse");
    g_assert(videoparse);

    videodec = gst_element_factory_make("imxvpudec", "dec");
    g_assert(videodec);

    videosink = gst_element_factory_make("imxipuvideosink", "sink");
    g_object_set(videosink, "sync", FALSE, NULL);
    g_assert(videosink);

    gst_bin_add_many(GST_BIN(pipeline), udpsrc, videodepay, videoparse, videodec, videosink,  NULL);
    gst_element_link(videodepay, videoparse);
    gst_element_link(videoparse, videodec);
    gst_element_link(videodec, videosink);
    g_signal_connect(udpsrc, "pad-added", G_CALLBACK(cb_new_pad), NULL);
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_main_loop = g_main_loop_new(NULL, FALSE);
    if ( NULL == g_main_loop )
    {
        printf("\r\nFailed in main Loop\r\n");
        exit(1);
    }
    bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
    bus_watch_id = gst_bus_add_watch(bus, bus_callback, g_main_loop);   
    gst_object_unref(GST_OBJECT(bus));
    g_main_loop_run(g_main_loop);
    return 0;
}

什么情况下会收到“pad-added”信号?

【问题讨论】:

  • 在错误消息中添加了调试信息字符串,它是“流停止,原因未链接(-1)”
  • 首先 - gst-launch 命令对你有用吗?如果错误是“未链接”,则您在构建管道时出错了 - 或者 AVC 的格式可能与您的特定解码器不兼容。 udpsrc 甚至没有“填充”信号。它只有一个静电垫。 “pad-added”对于具有动态 pad 的元素更有意义。
  • gst-launch 命令对我有用.. 我相信 udpsrc 是一个静态垫。如何检查 updsrc 是否有“pad-added”信号。是否使用“gst-inspect”
  • 使用gst-inspect-1.0 检查元素的信号。你会看到qtdemux 例如有一个pad-added 信号..
  • 我相信这就是问题所在。它没有填充信号

标签: c linux signals gstreamer


【解决方案1】:

您正在尝试使用带有元素udpsrc 的信号“pad-added”:

g_signal_connect(udpsrc, "pad-added", G_CALLBACK(cb_new_pad), NULL);

但是udpsrc 不会发出这样的信号。使用$ gst-inspect-1.0 udpsrc,您将看到:

$ gst-inspect-1.0 udpsrc

[...]

Pad Templates:
  SRC template: 'src'
    Availability: Always
    Capabilities:
      ANY

[...]

Pads:
  SRC: 'src'
    Pad Template: 'src'

上面写着那个垫子是ALWAYS。可能是SOMETIMESREQUEST。例如,如果您查看rtspsrc

$ gst-inspect-1.0 rtspsrc

[...]

Pad Templates:
  SRC template: 'stream_%u'
    Availability: Sometimes
    Capabilities:
      application/x-rtp
      application/x-rdt

[...]

Pads:
  none

[...]

Element Signals:
  "pad-added" :  void user_function (GstElement* object,
                                     GstPad* arg0,
                                     gpointer user_data);

注意这个有一个信号列表,而udpsrc 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多