Monibuca v4.4.0 发布 —— 开源 Go 语言流媒体服务器
新增重要功能
- 增加时光回溯功能
所谓时光回溯功能,就是加大视频流在服务器的缓存,可以通过配置publish下的buffertime来控制缓存多久。例如可以缓存7秒视频,那么服务器就会至少缓存7秒音视频数据,当我们需要订阅7s前的数据时,可以在订阅参数后面加上?mode=2实现从7秒前开始订阅。
启用该功能将会大大增加内存消耗,仅在特殊场合使用
-
- 订阅模式参数
订阅模式分为0、实时模式,会自动追赶。1、不追赶,防止视频跳跃。2、时光回溯模式,即从缓存最大的历史数据开始订阅。
订阅模式可以在配置项subscribe下指定,比如submode: 2 也可以通过订阅时附加到订阅地址的后面实现对单个订阅流的模式指定。如果URL参数发生冲突,比如本身需要用到mode这个参数,那么可以通过配置文件对submodeargname的定制这个参数名。
-
- 内存回收机制
本次修改最大的地方是修改了大量数据结构,简化代码同时,增加了对内存回收的机制,实现减少gc,在高并发下取得更高性能的效果。
后面会详细说明
-
- 增加对时间长度的配置格式解析
即可以配置带有时间单位的配置,例如10秒,可以配置为10s。数据结构使用time.Duration来接收
-
- 解决首屏渲染时无音频问题
该问题是由于设计音视频分轨后,音频轨道不好确定缓存长度所致,在本次升级中,采用了视频轨道得到关键帧后广播给音频轨道,使得音频轨道也能参与首屏渲染的读取过程中。该问题还会衍生出对外推流时开头没有音频数据导致对方判定无音频轨道的问题。此外也影响音视频时间戳和音视频同步等一系列问题。
升级指引
- 配置文件格式修改
配置文件中涉及到时间的地方,全部统一修改成带单位的形式!!
比如delayclosetimeout : 10 需要修改成 delayclosetimeout : 10s
时间单位可以用s(秒)m(分钟)ms(毫秒)等
-
- 二次开发插件
对于二次开发来说,本次需要适配一些定义的修改。
- 在接收音视频数据的地方,又原来的*AudioFrame和*VideoFrame修改为AudioFrame和VideoFrame。结构体中包含了*AVFrame和时间戳信息(为校准后的时间戳)
- VideoDecConf和AudioDecConf 内容变成avcc格式的序列头,对于视频轨道增加了可以接受common.ParamaterSets的事件,该结构体是一个数组,包含了SPS、PPS
- 原先的AVFrame中的Raw属性已修改为AUList,并且从数组改为了链表。如果需要循环读取其值可以通过链表提供的Range函数
- 对于Track中的WriteAVCC方法,其入参第二项修改为一个链表结构。该结构根据情况可以从BytesPool中通过Get或者GetShell获取到。
- Track中增加了BytesPool属性,用于内存回收,可以在NewXXXTrack时传入,也就是说,多个Track可以共用一个BytesPoll。但是需要注意的是,BytesPoll必须只能在同一个goroutine中使用(无锁)。不同的goroutine必须单独创建BytesPoll。
bug修复
- 当Streams.Get(streamPath)取不到值时会抛出panic导致程序崩了 · Issue #69 · Monibuca/engine (github.com)
- rtmp对外推拉时将参数带入推拉命令中(透传)
- dts生成时遇到pts超过最大值时就会出错
- 在rtmp推拉停止时读写AMF进行判断防止panic
- rtmp插件中修复类型3的chunk块也需要解析扩展时间戳的问题(该问题会引发了rtmp推拉播放中出现错误,卡顿、花屏的情况)
源码修改说明
- Media结构体去除了泛型
- 删除了ring_av,AVRing的读写逻辑分离,增加了AVRingReader结构体
- AVFrame去除泛型,音视频数据由数组改为链表
- 去除PlayContext结构体,由AVRingReader代替
- 增加通用的内存池和可回收元素的泛型链表实现
- rtmp插件代码大幅优化,减少内存申请
附:内存回收机制示意图

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Solon v2.0 大版本发布。提效率!降成本!
一个高效的 Java 应用开发框架:更快、更小、更简单。不是 Spring,没有 Servlet,也无关 JavaEE;新兴独立的开放生态。主框架仅 0.1 MB。 150来个生态插件,覆盖各种不同的应用开发场景: 相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 ~ 10 倍。 (更快) qps 高 2~ 3 倍。 (更高) 运行时内存节省 1/3 ~ 1/2。 (更少) 打包可以缩小到 1/2 ~ 1/10;比如,300Mb 的变成了 23Mb。 (更小) 同时支持 jdk8, jdk11, jdk17, jdk19 似曾相似的体验,入门更简单,迁移很方便: @Controller public class App { public static void main(String[] args) { Solon.start(App.class, args, app->{ //手写模式 app.get("/", ctx -> ctx.outputAsJson("{message:'Hello world!'}")) });...
- 下一篇
OpenHarmony 3.2 Beta5 发布
OpenHarmony 3.2 Beta5 已发布。 当前版本在OpenHarmony 3.2 Beta4的基础上,更新支持或优化增强的能力如下: 标准系统基础能力增强 webview启动性能优化;配置管理和对输入事件的支持等能力增强;模块化模式下可导入json文件并加载。 支持taskpool;hap包动态库不压缩加载;host版本TS2AOT-tool工具;编译器运行时支持应用内共享包。 支持安装/更新/卸载动态共享库;支持动态共享库打包和拆包;对未配置入口图标的应用,可在桌面显示默认图标;HAR共享包运行期能力可验证。 卡片本地数据库切换;常驻应用异常频繁重启保护;ServiceExtensionAbility支持异步onConnected生命周期。 支持本地帐号与域帐号绑定、认证,以及域帐号管理服务基础框架;支持禁止直接创建本地用户。 支持电源灯、light灯能力控制。 HDI驱动显示图层,可以实现对水平镜像和垂直镜像的支持。 标准系统应用开发框架增强 工具链新增编译共享包流程。 ArkUI适配了根据资源名称获取资源的能力。 提供多级菜单和分组菜单的组件能力。 新增编译har包...
相关文章
文章评论
共有0条评论来说两句吧...