# engine **Repository Path**: m7s/engine ## Basic Information - **Project Name**: engine - **Description**: No description available - **Primary Language**: Go - **License**: MIT - **Default Branch**: v4 - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-04-04 - **Last Updated**: 2023-01-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # m7s v4核心引擎 该项目为m7s的引擎部分,该部分逻辑是流媒体服务器的核心转发逻辑。包含了一个插件的引入机制,其他功能均由插件实现 # 引擎的基本功能 - 引擎初始化会加载配置文件,引入的插件会自动注册到引擎中 - 配置文件中配置会被解析并覆盖插件的默认配置 - 引擎提供配置热更新机制(具体热更新逻辑由插件实现) - 读取插件的特殊方法,将其注册为可供HTTP访问的API接口 - 具有发布功能的插件,可以将流注入到引擎中 - 具有订阅功能的插件,可以从引擎中订阅到流 - 引擎会将流中的数据放入RingBuffer中缓存,以便插件可以获取数据 - 引擎提供了从远端拉流和以及向远端推流的基础框架 - 引擎包了zap日志框架 - 引擎提供事件总线机制,可以对所有插件广播事件 ## 引擎自带HTTP接口 - 终止某一个流 `/api/closeStream?streamPath=xxx` - 获取engine信息 `/api/sysInfo` 返回值{Version:xxx,StartTime:xxx} - 获取系统基本情况 `/api/summary` 返回值Summary数据 - 获取指定的配置信息 `/api/getconfig?name=xxx` 返回xxx插件的配置信息,如果不带参数或参数为空则返回全局配置 - 修改并保存配置信息 `/api/modifyconfig?name=xxx` 修改xxx插件的配置信息,在请求的body中传入修改后的配置json字符串 - 热更新配置信息 `/api/updateconfig?name=xxx` 热更新xxx插件的配置信息,如果不带参数或参数为空则热更新全局配置 # 引擎默认配置 ```yaml global: http: # 网关地址,用于访问API listenaddr: :8080 # 用于HTTPS方式访问API的端口配置 listenaddrtls: "" certfile: "" keyfile: "" # 是否自动添加cors头 cors: true # 用户名和密码,用于API访问时的基本身份认证 username: "" password: "" publish: # 是否发布音频流 pubaudio: true # 是否发布视频流 pubvideo: true # 剔出已经存在的发布者,用于顶替原有发布者 kickexist: false # 发布流默认过期时间单位秒,超过该时间发布者没有恢复流将被删除 publishtimeout: 10 # 自动关闭触发后延迟的秒数(期间内如果有新的订阅则取消触发关闭) waitclosetimeout: 0 subscribe: # 是否订阅音频流 subaudio: true # 是否订阅视频流 subvideo: true # 只订阅关键帧 iframeonly: false # 等待发布者的秒数,用于订阅尚未发布的流 waittimeout: 10 # 启用RTP包乱序重排 rtpreorder : false # 启用AVCC格式缓存,用于rtmp协议 enableavcc : true # 启用rtp格式缓存,用于rtsp、websocket、gb28181协议 enablertp : true # 启用flv格式缓存,用于HDL协议,以及flv格式写文件 enableflv : true # 连接远程控制台的地址 consoleurl : wss://console.monibuca.com:8080 # 远程控制台的秘钥 secret: "" ``` # 配置覆盖机制 - 如果不存在配置文件,将使用默认配置,该配置值为代码中写死的配置值 - 如果存在配置文件,则使用配置文件中的值覆盖默认值 - http、publish、subscribe三个配置遵循优先级顺序 1. 如果发布流或者订阅流中包含对应的参数,则优先使用 2. 其次,查找对应插件的配置项中是否包含配置项 3. 最后,使用全局配置中的配置 # 流的状态图 ```mermaid stateDiagram-v2 [*] --> ⌛等待发布者 : 创建 ⌛等待发布者 --> 🟢正在发布 :发布 ⌛等待发布者 --> 🔴已关闭 :关闭 ⌛等待发布者 --> 🔴已关闭 :超时 ⌛等待发布者 --> 🔴已关闭 :最后订阅者离开 🟢正在发布 --> ⌛等待发布者: 发布者断开 🟢正在发布 --> 🟡等待关闭: 最后订阅者离开 🟢正在发布 --> 🔴已关闭 :关闭 🟡等待关闭 --> 🟢正在发布 :第一个订阅者进入 🟡等待关闭 --> 🔴已关闭 :关闭 🟡等待关闭 --> 🔴已关闭 :超时 🟡等待关闭 --> 🔴已关闭 :发布者断开 ```