Monibuca v4.4.0 发布 —— 开源 Go 语言流媒体服务器


  1. 新增重要功能

    1. 增加时光回溯功能

所谓时光回溯功能,就是加大视频流在服务器的缓存,可以通过配置publish下的buffertime来控制缓存多久。例如可以缓存7秒视频,那么服务器就会至少缓存7秒音视频数据,当我们需要订阅7s前的数据时,可以在订阅参数后面加上?mode=2实现从7秒前开始订阅。

启用该功能将会大大增加内存消耗,仅在特殊场合使用

    1. 订阅模式参数

订阅模式分为0、实时模式,会自动追赶。1、不追赶,防止视频跳跃。2、时光回溯模式,即从缓存最大的历史数据开始订阅。

订阅模式可以在配置项subscribe下指定,比如submode: 2 也可以通过订阅时附加到订阅地址的后面实现对单个订阅流的模式指定。如果URL参数发生冲突,比如本身需要用到mode这个参数,那么可以通过配置文件对submodeargname的定制这个参数名。

    1. 内存回收机制

本次修改最大的地方是修改了大量数据结构,简化代码同时,增加了对内存回收的机制,实现减少gc,在高并发下取得更高性能的效果。

后面会详细说明

    1. 增加对时间长度的配置格式解析

即可以配置带有时间单位的配置,例如10秒,可以配置为10s。数据结构使用time.Duration来接收

    1. 解决首屏渲染时无音频问题

该问题是由于设计音视频分轨后,音频轨道不好确定缓存长度所致,在本次升级中,采用了视频轨道得到关键帧后广播给音频轨道,使得音频轨道也能参与首屏渲染的读取过程中。该问题还会衍生出对外推流时开头没有音频数据导致对方判定无音频轨道的问题。此外也影响音视频时间戳和音视频同步等一系列问题。

  1. 升级指引

    1. 配置文件格式修改

配置文件中涉及到时间的地方,全部统一修改成带单位的形式!!

比如delayclosetimeout : 10 需要修改成 delayclosetimeout : 10s

时间单位可以用s(秒)m(分钟)ms(毫秒)

    1. 二次开发插件

对于二次开发来说,本次需要适配一些定义的修改。

  1. 在接收音视频数据的地方,又原来的*AudioFrame和*VideoFrame修改为AudioFrame和VideoFrame。结构体中包含了*AVFrame和时间戳信息(为校准后的时间戳)
  2. VideoDecConf和AudioDecConf 内容变成avcc格式的序列头,对于视频轨道增加了可以接受common.ParamaterSets的事件,该结构体是一个数组,包含了SPS、PPS
  3. 原先的AVFrame中的Raw属性已修改为AUList,并且从数组改为了链表。如果需要循环读取其值可以通过链表提供的Range函数
  4. 对于Track中的WriteAVCC方法,其入参第二项修改为一个链表结构。该结构根据情况可以从BytesPool中通过Get或者GetShell获取到。
  5. Track中增加了BytesPool属性,用于内存回收,可以在NewXXXTrack时传入,也就是说,多个Track可以共用一个BytesPoll。但是需要注意的是,BytesPoll必须只能在同一个goroutine中使用(无锁)。不同的goroutine必须单独创建BytesPoll。
  6. bug修复

  • 当Streams.Get(streamPath)取不到值时会抛出panic导致程序崩了 · Issue #69 · Monibuca/engine (github.com)
  • rtmp对外推拉时将参数带入推拉命令中(透传)
  • dts生成时遇到pts超过最大值时就会出错
  • 在rtmp推拉停止时读写AMF进行判断防止panic
  • rtmp插件中修复类型3的chunk块也需要解析扩展时间戳的问题(该问题会引发了rtmp推拉播放中出现错误,卡顿、花屏的情况)
  1. 源码修改说明

  • Media结构体去除了泛型
  • 删除了ring_av,AVRing的读写逻辑分离,增加了AVRingReader结构体
  • AVFrame去除泛型,音视频数据由数组改为链表
  • 去除PlayContext结构体,由AVRingReader代替
  • 增加通用的内存池和可回收元素的泛型链表实现
  • rtmp插件代码大幅优化,减少内存申请

附:内存回收机制示意图


相關推薦

2023-06-13

发布摘要 本次发布带来如下更新: 预览插件引入jessibuca pro demo 启动工程引入conf目录,添加若干常用配置示例 启动工程修改默认配置文件,增加https协议配置,以及hls、llhls 可以自定义favicon.ico 引擎中Stream增加P

2023-08-08

时无法拖放。这是由于fmp4的格式导致的,fmp4格式是一种流媒体格式,适合直播场景。本次修改为录制原始mp4格式。值得注意的时候,这种格式需要在录制完成的时候对文件再次修改,因此如果在文件没有写完时直接关闭进程会

2023-02-26

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer 元数建模 - v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用 React+Electron+Java 技

2023-04-08

LinkWeChat 基于企业微信开放能力,不仅集成了企微强大的后台管理及基础的客户管理功能,而且提供了多种渠道、多个方式连接微信客户。并通过客情维系、聊天增强等灵活高效的客户运营模块,让客户与企业之间建立强链接,

2023-10-31

我们汇总了框架从 v4.3.7 到 v4.4.3 的版本发布简报,中文手册也已经同步升级到了 v4.4.3 版本: https://codeigniter.org.cn/user_guide/index.html 下面是简报内容: 我们发布了新的 Bug 修复版本 v4.3.7。 这包含了几个小的 Bug 修复,包括小的

2023-03-27

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer 元数建模 - v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用 React+Electron+Ja

2023-06-08

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer 元数建模 - v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用 React+Electron+Java 技

2023-11-27

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer 元数建模 - v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用 React+Electron+Java 技

2023-07-23

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer元数建模-v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用React+Electron+Java技术体系

2023-03-20

特别说明 平台公云版及企业私云版已经发布,增加多人团队协作支持,点击这里了解 [PDManer 元数建模 - v4],历时五年,持续升级,工匠精神,做一款简单好用的数据库建模平台。 元数建模平台,使用 React+Electron+Java 技

2022-04-02

批处理,新的 API(如 startTransition)和支持 Suspense 的流式服务器端渲染。 公告指出,React 18 中的许多功能都建立在新的并发渲染器之上,这是一个解锁强大新功能的幕后更改。Concurrent React 是可选的,它仅在用户使用并发功能时

2022-11-12

VS Code 编辑器的 Go 代码提供了丰富的语言支持。Gopls 语言服务器也得到了性能优化。 在安全方面,Go 有一个新的的漏洞数据库和一个新的 govulncheck 命令,让 Go 开发者能够了解可能影响其项目的已知漏洞。 在 Go 的第 14 个

2022-04-02

批处理,新的 API(如 startTransition)和支持 Suspense 的流式服务器端渲染。 公告指出,React 18 中的许多功能都建立在新的并发渲染器之上,这是一个解锁强大新功能的幕后更改。Concurrent React 是可选的,它仅在用户使用并发功能时

2022-09-23

前言 本期主要对日志性能、远程请求性能还有诸多模块性能进行改进。 项目信息 Gitee:https://gitee.com/dotnetchina/Furion Github:https://github.com/MonkSoul/Furion 文档:https://dotnetchina.gitee.io/furion 本期更新 v4.4.8 版本细