基于gstreamer的支持动态获取多路流的rtsp server(笔记)
上篇文章讲了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(笔记)相关推荐
- 基于log4net的支持动态文件名、按日期和大小自动分割文件的日志组件
最近处理一个日志功能,用log4net的配置不能完全满足要求,所以在其基础上简单封装了一下,支持以下功能: 1 零配置 内置默认配置,引用dll后不需要添加或修改任何配置文件也可以使用 2 动态指定文 ...
- linux内核态获取ip地址,Linux内核支持动态获取IP地址
配置选项: NFS: Network File System PNP: Plug-and-Play CONFIG_ROOT_NFS 若想要Linux box通过NFS依赖网络上的其他计算机来mount ...
- spring gateway 限流持久化_Spring Cloud Gateway 扩展支持动态限流
之前分享过 一篇 <Spring Cloud Gateway 原生的接口限流该怎么玩>, 核心是依赖Spring Cloud Gateway 默认提供的限流过滤器来实现 原生Request ...
- android网络动态获取权限,基于JetPack实现的权限动态获取
最近在学习如何使用Jetpack以及kotlin,相较于以往使用的onActivityResult,androidx-activity 1.2.0-alpha02及Fragment 1.3.0-alp ...
- StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎
StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...
- 爬虫基于ADSL动态获取ip
爬虫访问中,如何解决网站限制IP的问题? 开发了一个爬虫,布置在自己的服务器上,请求某网站的查询功能,然后抓取查询结果,结果访问才一会儿,就被提示封IP了.有什么好的解决方法吗? 1. 某宝买代理,简 ...
- QT 音视频开发 基于gstreamer框架
在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备).国内不太常用的解决方案gstreamer gs ...
- 音视频开发(20)---基于RTMP推送实时AAC+H264流(一)
基于RTMP推送实时AAC+H264流(一) https://blog.csdn.net/scnu20142005027/article/details/56847293 从整体来看,推流端大概是这么 ...
- .NET6运行时动态更新限流阈值
自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户.前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会 ...
最新文章
- 全数字FM接收机2---仿真
- 使用MLeaksFinder检测项目内存泄露总结
- 【Android】Uri、UriMatcher、ContentUris详解
- 1.4 异常处理机制及异常处理的基本结构
- Java经典实例:比较浮点数
- linux用户修改用户shell
- c语言模拟试题快速排序,快速排序(东软喜欢考类似的算法填空题,又如堆排序的算法等)...
- ((CTRL-CHAR,code 8)) : only regular white space is allowed between tokens
- IOS Window窗口使用
- [USACO13OPEN]What's Up With Gravityp【最短路 / SPFA】
- 用python解方程和微积分
- matlab的基本语法规则_MATLAB基础语法
- 阿里巴巴的商品主图视频要怎么保存比较快
- 完整的ERP流程图大全
- 反病毒软件测试,PCSL手机反病毒软件测试 2011年7月
- Webx.0-Web2.0:Web2.0
- QT开发应用程序(17)-- 读写XLS文件
- WIDS(无线入侵检测)
- IDEA Windows + Mac 快捷键(全)
- UT-Exynos4412 三星ARM四核旗舰开发平台android4.0体验-5联通3G功能调试支持
热门文章
- 如何判断飞机的年限_身边没有懂车朋友如何购买二手车?
- 【李宏毅2020 ML/DL】补充:Structured Learning: Structured SVM
- 【李宏毅2020 ML/DL】P83 Generative Adversarial Network | Evaluation
- React Native 0.20官方入门教程
- php刷数据库数据库,php数据库操作种
- 翻译 Windows Server 2016和System Center 2016 技术预览版4 使创新更容易
- 听飞狐聊JavaScript设计模式系列07
- 当PowerDesigner的工具栏不见时候该怎么调出来
- flex 发送到java_(转)java与flex通信
- java 重定向关键字_springboot实现转发和重定向