其实也是运气好,找到了网上的代码。之后反复测试,排列组合,跟自己的代码整合起来了。
这里把有用的部分共享出来。
有朋友说跑不起来,这个时候先看看有哪些插件,参考:
https://blog.csdn.net/quantum7/article/details/84723053
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[]) { /* Initialize GStreamer */ gst_init(NULL, NULL); /* Build Pipeline */ pipel.pipeline = gst_pipeline_new("CSDN"); 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); GstBus* bus = gst_element_get_bus(pipeline); GstMessage* msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, (GstMessageType)(GST_MESSAGE_ERROR | GST_MESSAGE_EOS)); if (msg != NULL) { gst_message_unref(msg); } gst_object_unref (bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); }