-
新增重要功能
- 增加时光回溯功能
所谓时光回溯功能,就是加大视频流在服务器的缓存,可以通过配置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插件代码大幅优化,减少内存申请