全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例

简介: 全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例

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

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

有朋友说跑不起来,这个时候先看看有哪些插件,参考:

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);
}

 

目录
相关文章
|
Linux 数据安全/隐私保护 Windows
音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
2914 0
音视频开发:大华摄像头配置RTSP与RTMP地址访问视频画面
|
网络协议 编译器 Linux
FFMPEG音视频开发: 发布RTSP流(采用EasyDarwin作为流媒体服务器)
FFMPEG音视频开发: 发布RTSP流(采用EasyDarwin作为流媒体服务器)
797 1
FFMPEG音视频开发: 发布RTSP流(采用EasyDarwin作为流媒体服务器)
|
1月前
|
消息中间件 小程序 网络性能优化
蓝易云 - 直播小程序源码有用的协议知识:MQTT协
在直播小程序源码中,MQTT协议可以用于实现实时消息推送,如弹幕、聊天消息、礼物信息等。通过使用MQTT协议,可以确保消息的实时性和可靠性,从而提高用户体验。
58 0
|
1月前
|
Web App开发
web接入海康相机视屏流 注意事项 - 编码H264
web接入海康相机视屏流 注意事项 - 编码H264
53 1
|
1月前
|
Linux C++ iOS开发
VLC源码解析:视频播放速度控制背后的技术
VLC源码解析:视频播放速度控制背后的技术
191 0
|
9月前
|
数据采集 开发工具 Android开发
Android平台如何实现屏幕数据采集并推送至RTMP服务器
随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP数据到流媒体服务器。
140 0
|
9月前
|
Web App开发 开发工具 Android开发
Android平台不需要单独部署流媒体服务如何实现内网环境下一对一音视频互动
我们在做内网环境的一对一音视频互动的时候,遇到这样的技术诉求:如智能硬件场景下(比如操控智能硬件),纯内网环境,如何不要单独部署RTMP或类似流媒体服务,实现一对一音视频互动。
|
1月前
|
数据采集 编解码 图形学
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务
152 0
全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
全网首发:gstreamer如何接入RTSP流(IP摄像头)的代码范例
1190 0
|
10月前
|
消息中间件 存储 小程序
直播小程序源码有用的协议知识:MQTT协议
MQTT协议能够帮助直播小程序源码平台进行可靠高效的消息传输、实时数据统计分析、实时推送订阅消息与辅助弹幕和实时评论,让直播小程序源码平台向着高质量平台方向迈进,是重要的协议之一。
直播小程序源码有用的协议知识:MQTT协议