c++11实现的一个消息总线框架

最近在看C++11的特性,然后按照网上的例子实现了一个消息总线框架。

https://github.com/hejiajie1989/MessageBus

项目里README文档里有详细的设计说明,

使用的时候
g++ test.cpp -o test -std=c++11
g++ TestMessageBus.cpp -o TestMessageBus -std=c++11

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
zbus核心是一个独立实现的小巧极速的消息队列(MQ),支持持久化与内存队列, 支持单播、广播、组播等多种消息通信模式;在MQ之上zbus完备地支持了RPC服务,RPC支持独立伺服,基于总线两种模式;同时zbus支持代理服务,基于MQ的HttpProxy实现了类Nginx的HTTP代理服务(支持DMZ网络结构),TcpProxy则支持透明的TCP协议代理,可以代理任何基于TCP的协议,比如代理MySQL数据库。 zbus内建分布式高可用(HA),解决单点问题;Java/.NET/JS/C++/PHP等主流语言接入能力为zbus充当SOA服务总线提供跨平台支持; 在设计上,zbus拥抱KISS准则,所有特性浓缩在一个小小的400K左右的jar包中(非常少的依赖);轻量,MQ核心,方便二次开发,zbus为微服务架构、系统整合、弹性计算、消息推送等场景提供开箱即用的功能支持。 ZBUS主要特性: 1、高速磁盘/内存MQ,支持单播,广播,组播,订阅多种消息模式 2、RPC开箱即用,支持同步异步,动态类代理 3、多语言客户端,Java/.NET/JavaScript/PHP/Python/C++/Go(服务器) 4、轻量级,发行大小 ~3M, 核心 ~400K, 极少依赖 5、高可用无应用故障单点,分布式高可用的内置支持 6、简洁的协议设计,类HTTP头部扩展协议,长短连接,WebSocket支持 7、内置监控,不断丰富的监控指标 ZBUS以轻量弹性著称,目前已知的应用主要分布在证券金融行业,在各大券商内部使用,因为开源同时也有不少二次开发定制的项目存在。 ZBUS可以有多种工作角色: 1、MQ服务器 2、RPC服务器 3、Proxy HTTP/TCP代理 4、服务标准化总线服务器
### 回答1: 以下是使用DeepStream C版本进行推流的示例代码: ```c #include <gst/gst.h> #include <glib.h> #include <deepstream_common.h> #include <deepstream_config.h> #include <deepstream_sources.h> #include <deepstream_sink_bin.h> #include <deepstream_metadata.h> #define TILED_OUTPUT_WIDTH 1280 #define TILED_OUTPUT_HEIGHT 720 int main(int argc, char *argv[]) { GstElement *pipeline = NULL; GstBus *bus = NULL; GstMessage *msg = NULL; GError *error = NULL; gchar *pipeline_string = NULL; guint bus_watch_id; // 初始化 GStreamer gst_init(&argc, &argv); // 创建管道 pipeline_string = g_strdup_printf( "filesrc location=%s ! qtdemux ! h264parse ! nvv4l2decoder ! " "nvstreammux name=mux batch-size=1 width=%d height=%d ! " "nvinfer config-file-path=/path/to/config_file.txt ! " "nvvideoconvert ! nvdsosd ! nvegltransform ! nveglglessink sync=false", argv[1], TILED_OUTPUT_WIDTH, TILED_OUTPUT_HEIGHT); pipeline = gst_parse_launch(pipeline_string, &error); if (!pipeline) { g_printerr("Pipeline could not be created. Error: %s\n", error->message); g_clear_error(&error); return -1; } // 创建消息总线 bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); bus_watch_id = gst_bus_add_watch(bus, bus_call, NULL); // 启动管道 gst_element_set_state(pipeline, GST_STATE_PLAYING); // 进入事件循环 g_main_loop_run(loop); // 停止管道 gst_element_set_state(pipeline, GST_STATE_NULL); // 释放资源 gst_object_unref(GST_OBJECT(pipeline)); gst_object_unref(GST_OBJECT(bus)); g_source_remove(bus_watch_id); g_free(pipeline_string); return 0; } ``` 在此示例中,我们使用DeepStream C库创建了一个GStreamer管道,该管道从H264编码视频文件中读取数据,并进行解码,分类和渲染,最终将输出渲染到屏幕上。 注意:此示例代码是基于DeepStream 5.1版本的,您需要根据自己的DeepStream版本和配置文件来调整代码。同时,您需要确保已正确安装DeepStream SDK并正确设置环境变量。 ### 回答2: 要编写一个DeepStream C版本的推流代码,需要首先安装DeepStream SDK并配置好开发环境。 下面是一个简单的DeepStream C版本推流代码示例: ```c #include <deepstream_common.h> #include <gst/gst.h> // 定义推流功能的回调函数 gboolean push_to_rtmp(gpointer data) { GstElement *pipeline; GstBus *bus; GstMessage *msg; // 构建GStreamer pipeline pipeline = gst_parse_launch("videotestsrc ! x264enc ! flvmux ! rtmpsink location=rtmp://example.com/live/stream", NULL); // 启动pipeline gst_element_set_state(pipeline, GST_STATE_PLAYING); // 等待pipeline结束并打印错误信息 bus = gst_element_get_bus(pipeline); msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR); if (msg != NULL) { GError *err; gchar *debug_info; gst_message_parse_error(msg, &err, &debug_info); g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message); g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error(&err); g_free(debug_info); } gst_message_unref(msg); gst_object_unref(bus); gst_element_set_state(pipeline, GST_STATE_NULL); gst_object_unref(pipeline); return G_SOURCE_REMOVE; } int main(int argc, char *argv[]) { GMainLoop *loop; // 初始化GStreamer库 gst_init(&argc, &argv); // 创建GMainLoop事件循环 loop = g_main_loop_new(NULL, FALSE); // 启动推流 g_timeout_add_seconds(10, push_to_rtmp, NULL); // 10秒后开始推流 // 运行事件循环 g_main_loop_run(loop); // 退出程序 g_main_loop_unref(loop); gst_deinit(); return 0; } ``` 这个示例代码使用GStreamer库,建立了一个简单的推流pipeline,将视频源输入经过编码和封装后推送到RTMP服务器上。在main函数中,我们使用GMainLoop来启动推流并运行事件循环,之后就可以将视频数据推送到RTMP服务器上。 注意,这只是一个简单的示例代码,实际使用中可能需要根据自己的需求和配置进行修改。 ### 回答3: deepstream是一个基于NVIDIA的深度学习推理平台,它提供了一个用于构建智能视频分析应用程序的框架。在deepstream中,可以使用C语言编写推流代码来将视频数据发送到外部服务器或流媒体平台。以下是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include "nvds_msgapi.h" #define MAX_SUPPORTED_ENCODERS 64 int main(int argc, char *argv[]) { const char *inputPath = "input.mp4"; // 视频输入路径 const char *outputUri = "rtmp://example.com/stream"; // 视频输出地址 nvds_msgapi_handle_t conn = NULL; nvds_msgapi_connect_async_params_t connect_params = NVDS_MSGAPI_CONNECT_ASYNC_PARAMS_INIT; // 初始化消息传递API连接参数 connect_params.conn_func = (nvds_msgapi_connect_cb_t) &nvds_msgapi_connect_cb; connect_params.disconn_func = (nvds_msgapi_connect_cb_t) &nvds_msgapi_disconnect_cb; connect_params.connect_params.client_id = "deepstream_push"; connect_params.connect_params.proto = "producer"; connect_params.connect_params.server_uri = outputUri; // 连接到目标服务器 nvds_msgapi_connect_async(&connect_params, &conn); // 打开输入视频文件 FILE *inputFile = fopen(inputPath, "rb"); if (inputFile == NULL) { fprintf(stderr, "无法打开输入文件\n"); return -1; } // 按帧读取视频文件并发送到服务器 while (1) { uint8_t frameData[4096]; // 帧数据缓冲区大小 size_t bytesRead = fread(frameData, 1, sizeof(frameData), inputFile); if (bytesRead == 0) { break; } // 将帧数据发送到服务器 nvds_msgapi_send_async(conn, (const uint8_t *) frameData, bytesRead); } // 关闭输入文件和与服务器的连接 fclose(inputFile); nvds_msgapi_disconnect(conn); return 0; } ``` 上述代码使用了deepstream的消息传递API来发送帧数据到指定的服务器。它通过打开输入视频文件,按帧读取数据,并将数据发送到服务器的URI地址指定的位置。在实际使用中,需要替换`inputPath`和`outputUri`为相关的实际路径和地址,并且需要根据需要进行其他定制化开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值