上篇文章讲了streamer的rtsp推流的基本用法

下面讲搭建动态多路流的rtsp server。有两种方式能达到效果,一种采用main_loop_run运行在线程里,另一种则是创建factory等操作可在有需要的时候动态创建。代码基于gst自带的示例test-readme.c改造,编译同gst示例

一、方法一代码

#include <gst/gst.h>#include <gst/rtsp-server/rtsp-server.h>
#include <pthread.h>void* testFun(void *args)
{GMainLoop *loop = (GMainLoop *) args;g_main_loop_run (loop);
}int
main (int argc, char *argv[])
{GMainLoop *loop;GstRTSPServer *server;GstRTSPMountPoints *mounts;GstRTSPMediaFactory *factory;gst_init (&argc, &argv);loop = g_main_loop_new (NULL, FALSE);pthread_t tTest;pthread_create(&tTest, NULL, testFun, loop);/* create a server instance */server = gst_rtsp_server_new ();gst_rtsp_server_set_service (server, "8555");/* get the mount points for this server, every server has a default object* that be used to map uri mount points to media factories */mounts = gst_rtsp_server_get_mount_points (server);/* make a media factory for a test stream. The default media factory can use* gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each* element with pay%d names will be a stream */factory = gst_rtsp_media_factory_new ();gst_rtsp_media_factory_set_launch (factory,"( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )");gst_rtsp_media_factory_set_shared (factory, TRUE);/* attach the test factory to the /test url */gst_rtsp_mount_points_add_factory (mounts, "/test", factory);/* don't need the ref to the mapper anymore */g_object_unref (mounts);/* attach the server to the default maincontext */gst_rtsp_server_attach (server, NULL);/* start serving */g_print ("stream ready at rtsp://127.0.0.1:8554/test\n");//g_main_loop_run (loop);pthread_join(tTest, NULL);return 0;
}

二、方法二的代码

#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>const char* port = "10001";static void
handle_client (GstRTSPClient * client, GstRTSPContext * ctx,GstRTSPServer * server, gpointer user_data)
{GstRTSPClientClass *klass;GstRTSPMountPoints *mounts;GstRTSPMediaFactory *factory;GstRTSPUrl *uri;gchar *path;gchar *launch = "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )";uri = ctx->uri;if (!uri)return;klass = GST_RTSP_CLIENT_GET_CLASS (client);path = klass->make_path_from_uri (client, uri);mounts = gst_rtsp_server_get_mount_points (server);factory = gst_rtsp_mount_points_match (mounts, path, NULL);if (!factory){factory = gst_rtsp_media_factory_new ();gst_rtsp_media_factory_set_launch (factory, launch);gst_rtsp_media_factory_set_shared (factory, TRUE);//g_signal_connect (factory, "media-constructed", (GCallback)//                                              media_constructed, NULL);gst_rtsp_mount_points_add_factory (mounts, path, factory);g_print ("new factory: %s\n", launch);}else{g_object_unref (factory);}g_object_unref (mounts);g_free (path);//g_free (launch);
}static void
client_connected (GstRTSPServer * server,GstRTSPClient * client, gpointer user_data)
{g_signal_connect_object (client, "options-request", (GCallback)handle_client, server, G_CONNECT_AFTER);
}static gboolean
timeout (GstRTSPServer * server)
{GstRTSPSessionPool *pool;pool = gst_rtsp_server_get_session_pool (server);gst_rtsp_session_pool_cleanup (pool);g_object_unref (pool);return TRUE;
}int
main (int argc, char *argv[])
{GMainLoop *loop;GstRTSPServer *server;GError *error = NULL;gst_init (&argc, &argv);loop = g_main_loop_new (NULL, FALSE);/* create a server instance */server = gst_rtsp_server_new ();gst_rtsp_server_set_service (server, port);/* attach the server to the default maincontext */gst_rtsp_server_attach (server, NULL);g_signal_connect (server, "client-connected", (GCallback)client_connected, NULL);g_timeout_add_seconds (2, (GSourceFunc) timeout, server);g_object_unref (server);/* start serving */g_print ("rtsp://127.0.0.1:%s/\n", port);g_main_loop_run (loop);return 0;
}
由于偷懒,handle_client函数里直接用的teat-readme里的代码。如果想获取自定义的流,可以将改函数里的内容替换为test-appsrc相关代码

下载链接:https://download.csdn.net/download/yingyemin/11016282

基于gstreamer的支持动态获取多路流的rtsp server(笔记)相关推荐

  1. 基于log4net的支持动态文件名、按日期和大小自动分割文件的日志组件

    最近处理一个日志功能,用log4net的配置不能完全满足要求,所以在其基础上简单封装了一下,支持以下功能: 1 零配置 内置默认配置,引用dll后不需要添加或修改任何配置文件也可以使用 2 动态指定文 ...

  2. linux内核态获取ip地址,Linux内核支持动态获取IP地址

    配置选项: NFS: Network File System PNP: Plug-and-Play CONFIG_ROOT_NFS 若想要Linux box通过NFS依赖网络上的其他计算机来mount ...

  3. spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流

    之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...

  4. android网络动态获取权限,基于JetPack实现的权限动态获取

    最近在学习如何使用Jetpack以及kotlin,相较于以往使用的onActivityResult,androidx-activity 1.2.0-alpha02及Fragment 1.3.0-alp ...

  5. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

  6. 爬虫基于ADSL动态获取ip

    爬虫访问中,如何解决网站限制IP的问题? 开发了一个爬虫,布置在自己的服务器上,请求某网站的查询功能,然后抓取查询结果,结果访问才一会儿,就被提示封IP了.有什么好的解决方法吗? 1. 某宝买代理,简 ...

  7. QT 音视频开发 基于gstreamer框架

    在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备).国内不太常用的解决方案gstreamer gs ...

  8. 音视频开发(20)---基于RTMP推送实时AAC+H264流(一)

    基于RTMP推送实时AAC+H264流(一) https://blog.csdn.net/scnu20142005027/article/details/56847293 从整体来看,推流端大概是这么 ...

  9. .NET6运行时动态更新限流阈值

    自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户.前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会 ...

最新文章

  1. 全数字FM接收机2---仿真
  2. 使用MLeaksFinder检测项目内存泄露总结
  3. 【Android】Uri、UriMatcher、ContentUris详解
  4. 1.4 异常处理机制及异常处理的基本结构
  5. Java经典实例:比较浮点数
  6. linux用户修改用户shell
  7. c语言模拟试题快速排序,快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)...
  8. ((CTRL-CHAR,code 8)) : only regular white space is allowed between tokens
  9. IOS Window窗口使用
  10. [USACO13OPEN]What's Up With Gravityp【最短路 / SPFA】
  11. 用python解方程和微积分
  12. matlab的基本语法规则_MATLAB基础语法
  13. 阿里巴巴的商品主图视频要怎么保存比较快
  14. 完整的ERP流程图大全
  15. 反病毒软件测试,PCSL手机反病毒软件测试 2011年7月
  16. Webx.0-Web2.0:Web2.0
  17. QT开发应用程序(17)-- 读写XLS文件
  18. WIDS(无线入侵检测)
  19. IDEA Windows + Mac 快捷键(全)
  20. UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-5联通3G功能调试支持

热门文章

  1. 如何判断飞机的年限_身边没有懂车朋友如何购买二手车?
  2. 【李宏毅2020 ML/DL】补充:Structured Learning: Structured SVM
  3. 【李宏毅2020 ML/DL】P83 Generative Adversarial Network | Evaluation
  4. React Native 0.20官方入门教程
  5. php刷数据库数据库,php数据库操作种
  6. 翻译 Windows Server 2016和System Center 2016 技术预览版4 使创新更容易
  7. 听飞狐聊JavaScript设计模式系列07
  8. 当PowerDesigner的工具栏不见时候该怎么调出来
  9. flex 发送到java_(转)java与flex通信
  10. java 重定向关键字_springboot实现转发和重定向