gstreamer如何接入RTSP流(IP摄像头)

其实也是运气好,找到了网上的代码。之后反复测试,排列组合,跟自己的代码整合起来了。

这里把有用的部分共享出来:

static void on_pad_added (GstElement *element, GstPad *pad, gpointer data)
{
    GstPad *sinkpad;
    GstElement *decoder = (GstElement *) data;
    /* We can now link this pad with the rtsp-decoder sink pad */
    g_print ("Dynamic pad created, linking source/demuxer\n");
    sinkpad = gst_element_get_static_pad (decoder, "sink");
    gst_pad_link (pad, sinkpad);
    gst_object_unref (sinkpad);
}

static void cb_new_rtspsrc_pad(GstElement *element, GstPad*pad, gpointer data)
{
    gchar *name;
    GstCaps * p_caps;
    gchar * description;
    GstElement *p_rtph264depay;

    name = gst_pad_get_name(pad);
    g_print("A new pad %s was created\n", name);

    // here, you would setup a new pad link for the newly created pad
    // sooo, now find that rtph264depay is needed and link them?
    p_caps = gst_pad_get_pad_template_caps (pad);

    description = gst_caps_to_string(p_caps);
    printf("%s\n", p_caps, ", ", description,"\n");
    g_free(description);

    p_rtph264depay = GST_ELEMENT(data);

    // try to link the pads then ...
    if (!gst_element_link_pads(element, name, p_rtph264depay, "sink"))
    {
        printf("Failed to link elements 3\n");
    }

    g_free(name);
}


int main(int argc, char *argv[])
{
    GMainLoop *loop      = NULL;

    /* Initialize GStreamer */
    gst_init(NULL, NULL);

    /* Build Pipeline */ 
    pipel.pipeline = gst_pipeline_new("CSDN");

    //无必要
    creating_pipeline(ip_address, port);

    source    = gst_element_factory_make ( "rtspsrc", "source");
    g_object_set (G_OBJECT (pipel.source), "latency", 2000, NULL);
    rtppay    = gst_element_factory_make ( "rtph264depay", "depayl");
    parse     = gst_element_factory_make ( "h264parse",    "parse");
    decodebin = gst_element_factory_make ( "openh264dec",  "decode");
    sink      = gst_element_factory_make ( "d3dvideosink", "sink");

    g_object_set (G_OBJECT (pipel.sink), "sync", FALSE, NULL);

    //create_uri(url,url_size, ip_address, port);
    g_object_set(GST_OBJECT(pipel.source), "location", RTSP_SOURCE, NULL);
    //"rtsp://<ip>:554/live/ch00_0"

    //无必要
    filter1    = gst_element_factory_make("capsfilter", "filter");
    filtercaps = gst_caps_from_string("application/x-rtp");
    g_object_set (G_OBJECT (pipel.filter1), "caps", filtercaps, NULL);
    gst_caps_unref(filtercaps);

    gst_bin_add_many (GST_BIN (pipel.pipeline), source, rtppay, NULL);
    // listen for newly created pads
    g_signal_connect(source, "pad-added", G_CALLBACK(cb_new_rtspsrc_pad), rtppay);
    gst_bin_add_many (GST_BIN (pipeline), parse,NULL);
    if (!gst_element_link(rtppay, parse))
    {
        printf("\nNOPE\n");
    }

    gst_bin_add_many (GST_BIN (pipeline), decodebin, sink, NULL);

    if (!gst_element_link_many(parse, decodebin, sink, NULL))
    {
        printf("\nFailed to link parse to sink");
    }

    //不是必须 
    //g_signal_connect(rtppay, "pad-added", G_CALLBACK(on_pad_added), parse);

    //不需要的可以将此注释。
    gst_element_set_state (pipeline, GST_STATE_PLAYING);
    g_main_loop_run (loop);
}

如下:

猜你喜欢

转载自blog.csdn.net/quantum7/article/details/82151637