Compare commits

..

311 Commits
v1.2.1 ... v4

Author SHA1 Message Date
langhuihui
c830663e13 chore: update dependencies to latest tags - engine/v4 v4.15.3 - gb28181/v4 v4.4.6 - logrotate/v4 v4.0.7 - record/v4 v4.4.8 - rtsp/v4 v4.3.6 2024-12-13 17:16:20 +08:00
langhuihui
7ca1982eef fix: record mp4 read too slow 2024-11-11 14:19:31 +08:00
langhuihui
ccccb9c4dc feat: LATM support 2024-10-21 14:23:37 +08:00
langhuihui
07a2f8673c fix: delayclosetimeout not work 2024-08-29 19:52:07 +08:00
langhuihui
c0ead90d46 feat: log add auto delete , gb update gosip lib, record add play flv 2024-08-19 16:43:01 +08:00
langhuihui
b24d3415fb chore: update gb28181 and ps 2024-08-01 14:47:46 +08:00
langhuihui
2b9adea54f feat: add record vod play flv from flv files 2024-07-26 16:32:22 +08:00
langhuihui
062f0ecbac fix: submode=2 don't limit speed
fix: recycle port
fix: ps listen 1
2024-07-26 11:15:59 +08:00
langhuihui
6f5ded0738 fix: jessibuca play submode=2 not work
feat: add config file from env value
fix: pull save
refactor: remove sei track
fix: amf Marshal AMF0_STRICT_ARRAY do not write end
2024-07-09 20:09:11 +08:00
langhuihui
b5781bad3c fix: jessibuca play submode=2 not work 2024-06-27 18:41:56 +08:00
langhuihui
e11c582b51 feat: add config file from env value 2024-06-18 17:24:07 +08:00
dexter
28531ec17f Merge pull request #130 from ptrjeffrey/v4
支持环境变量指定配置文件路径
2024-06-17 08:38:21 +08:00
sean.zhang
2fce421b2e 修改环境变量名 2024-06-15 10:56:56 +08:00
sean.zhang
c8553f2073 支持环境变量指定配置文件路径 2024-06-15 10:53:26 +08:00
langhuihui
122de52fea fix: discard 2024-06-14 15:12:53 +08:00
langhuihui
db4a51eaa5 fix: record with fileName,rtmp with extend timestamp 2024-05-21 09:28:40 +08:00
langhuihui
7d6f3dbab8 fix: h265 parse sps , save=2 eof , config point panic 2024-05-07 17:29:25 +08:00
dexter
21e0843af3 Merge pull request #122 from trulykyle/v4
docker support
2024-04-30 12:04:15 +08:00
Kyle
91d0e20748 running in host network mode for performance optimizaiton 2024-04-29 22:45:39 +02:00
Kyle
0f94c380eb add docker-compose file 2024-04-29 21:46:53 +02:00
Kyle
601ea27358 split docker to build/running stages 2024-04-29 21:23:33 +02:00
langhuihui
e4fd81c237 fix: data track set logger 2024-04-02 19:23:24 +08:00
langhuihui
127cd38380 fix: pull save 2024-04-02 15:57:40 +08:00
langhuihui
14749f3e48 feat: update go version to 1.21 2024-03-15 10:09:22 +08:00
langhuihui
74d9eb0cb2 fix: update cert 2024-03-15 09:48:14 +08:00
langhuihui
87f97fe243 feat: update logo 2024-03-12 16:10:49 +08:00
langhuihui
d095c45dee refactor: remove sei track 2024-03-07 20:50:24 +08:00
langhuihui
f2e119e0e5 1. fix: subscriber wait track timeout
2. feat: reduce wait close when no subscribe
3. fix: rtmp encode nil value
4. fix: global value override
5. fix: new publisher use old track
6. fix: WriteRTPFrame panic
7. feat: fit wrong timestamp
8. fix: debug get profile
9. fix: fmp4 h265 with enhanced rtmp protocol
10. fix: logrotate grep_linux.go
11. fix: rtmp seqhead will reset timestamp、bad publish
12. feat: room add args to  userleave and user enter event
13. feat: room add ping and pong to websocket connection
14. feat: webrtc play add query
15. fix: webrtc add PeerConnectionStateClosed handler to publisher and subscriber
2024-02-21 10:59:56 +08:00
langhuihui
1379471390 fix: fmp4 play h265, rtmp send seqhead reset timestamp bug 2024-02-12 21:36:16 +08:00
langhuihui
e5bcdb227c feat: add auto build docker 2024-01-24 15:09:47 +08:00
langhuihui
06bf245f2b fix: global config not overide 2024-01-22 16:26:09 +08:00
langhuihui
90d8008e3b feat:
- add desc to config struct
- remove gen.go
2024-01-03 09:47:50 +08:00
langhuihui
063e994328 chore: update preview plugin 2023-12-26 11:13:14 +08:00
langhuihui
52eacbaecb feat: remove gen.go 2023-12-20 10:18:28 +08:00
langhuihui
a8af274ec7 feat: upload to beta 2023-12-18 14:06:00 +08:00
langhuihui
2a2577b9f9 feat: add desc to config struct 2023-12-14 14:33:09 +08:00
langhuihui
3d28bed6f0 fix: h265 2023-12-01 15:56:32 +08:00
langhuihui
f17db659dd chore: modify conf dir name 2023-11-27 20:48:20 +08:00
langhuihui
fdef232edc feat: add av1 and opus support 2023-11-17 17:42:41 +08:00
langhuihui
eb3ffe6cd6 fix: repull will dead 2023-11-16 19:28:54 +08:00
langhuihui
9cbbee3f54 fix: record hls ts duration wrong 2023-11-07 11:11:11 +08:00
langhuihui
3bdc5074e0 fix: rtsp relay 2023-11-03 14:12:56 +08:00
langhuihui
35a10e1c39 fix: rtsp repull bug 2023-11-03 09:45:51 +08:00
langhuihui
722f7d1a5e feat: 兼容不规范的 rtp 包和 sdp 2023-10-27 18:04:11 +08:00
langhuihui
1399beef60 - Engine aspect
1. Add a flow state
2. Add regular expressions to remote push pull
3. Add InviteTrack event
4. Fix several bugs

- In terms of plugins

1. GB 28181 Video Streaming Automatic Shutdown for Unmanned Viewing
2. HLS fixes playback issues and upgrades Gohlslib library
3. Record repairs HLS recording, fixes API method for passing fragment parameters
4. RTMP fixes issues caused by TCP connection failure
5. Upgrade gortsplib to v4 using rtsp
6. Webrtc fixes bug in subscription multiplexing
7. Webrtransport does not configure certificates to automatically use built-in certificates

- 引擎方面

1. 增加一个流状态
2. 远端推拉增加正则表达式
3. 增加 InviteTrack 事件
4. 修复若干 bug

- 插件方面

1. gb28181 录像流无人观看自动关闭
2. hls 修复播放问题,升级 gohlslib 库
3. record 修复 hls 录制,修复 api 方式传递 fragment 参数
4. rtmp 修复因tcp 连接失败导致的问题
5. rtsp 升级 gortsplib到 v4
6. webrtc 修复订阅多路的 bug
7. webrtransport 不配置证书自动使用内置证书
2023-10-23 14:50:13 +08:00
langhuihui
84f9a02e0a fix: hls pull ts no content-length 2023-10-23 10:09:15 +08:00
langhuihui
7f97d26a2b fix: hls record and play 2023-10-18 14:06:35 +08:00
langhuihui
17dab13edf feat: pull and push support regexp
feat: add pagation support
 fix: stop subscribe when error
2023-09-28 15:42:50 +08:00
langhuihui
1218158b3e fix: panic and hls record 2023-09-25 15:12:39 +08:00
langhuihui
42b8c6256f chore: update aurora and mp4ff lib 2023-09-20 19:29:03 +08:00
langhuihui
13654367d7 fix: pull will sleep at first 2023-09-18 17:17:16 +08:00
langhuihui
bae642096c fix: rtsp plugin memory leak 2023-09-15 16:19:15 +08:00
langhuihui
51c4cd6291 fix: stream close process 2023-09-14 10:13:50 +08:00
langhuihui
8707d953fe 1. Retrying after remote streaming interruption increases waiting time and fixes retry failure issues
2. Fix concurrent request summary interface timeout
3. Parameters can be passed in during HLS subscription
4. Fix memory leaks in the monitor plugin
5. Fix panic caused by incorrect stream address during Disconnect

- 1、远端拉流中断后重试增加等待时间,修复重试失效问题
- 2、修复并发请求summary接口超时
- 3、hls订阅时可传入参数
- 4、修复monitor插件内存泄露
- 5、修复错误的流地址导致的Disconnect时panic
2023-09-10 12:19:48 +08:00
dexter
95888790f0 Merge pull request #95 from dwdcth/patch-2
Update go.yml
2023-09-07 14:41:33 +08:00
langhuihui
dfd9af1efd fix: ps解析异常 tcp 逻辑,avoid repull too fast 2023-09-07 13:11:49 +08:00
banshan
475242ff6a Update go.yml 2023-09-06 21:09:31 +08:00
langhuihui
9933950f61 feat: gb的 channel增加输出字段,fix summary timeout 2023-09-06 14:18:27 +08:00
langhuihui
055eb6c022 feat: hls add args to subscriber 2023-08-31 13:41:44 +08:00
langhuihui
7d5b0fbb32 fix: rtsp 修复错误的流地址导致的Disconnect时panic 2023-08-31 09:05:13 +08:00
langhuihui
15da702fec fix: memory leak 2023-08-29 09:43:48 +08:00
langhuihui
e8dbdb4aef fix: engine Run func
- fix receive panic
- fix ps decode memory leak
- gortsplib upgrade to v3.10.0
2023-08-25 15:05:52 +08:00
langhuihui
5a7aec092c fix: plugin-hls version must be 4.3.3 2023-08-15 08:55:26 +08:00
langhuihui
4ab1f8e9a1 - API 现在可以返回{"data":xxx,"code":0,"msg":"ok"}
格式
- 按需拉流的事件的类型从`*Stream`修改为`InvitePublish`
- 远程拉流频繁重连后导致多路远程流同时写入同一个`track`
- 在并发序列化`Tracks`时导致错误,通过加锁解决
- 修复`Record`插件录制`fmp4`格式报错
- 更新`WebRTC`插件依赖库版本
- 更新依赖库`quic-go`版本
- 优化`ps`插件中的`tcp`收流逻辑
- 优化`rtmp`插件streamId计算方法
2023-08-14 12:39:57 +08:00
langhuihui
660886fc01 fix: record g711 in mp4 2023-08-07 09:12:47 +08:00
langhuihui
a71166937e - Refactoring the Record plugin to support mp4 format (non fmp4)
- Optimize HLS plugin memory usage
- Change the default remote streaming of RTSP to TCP protocol
- Reason for subscriber closure increase closure
- Reconstruct the summary to reduce invalid collection and prevent concurrent reads and writes
- Add API for mandatory closure of subscribers
- Remote streaming encountered an unreachable address and will no longer retry indefinitely

- 重构Record插件,支持mp4格式(非fmp4)
- 优化HLS插件内存使用
- rtsp远端拉流默认改成tcp协议
- 订阅者关闭增加关闭原因
- 重构summary,减少无效采集,防止并发读写
- 增加强制关闭订阅者的api
- 远端拉流遇到无法连接的地址不再无限重试
2023-08-06 18:07:36 +08:00
langhuihui
dc54771200 update dockerfile 2023-07-14 16:46:32 +08:00
langhuihui
52bd4c54e7 - fix: record flv append not work
- fix: data track reader
- feat: ignore auth for internal subscriber
- chore: optimize webrtc subscribe

desc:
- 修复了flv的append不生效的问题
- data track读取问题
- 忽略内部订阅者的鉴权功能
- webrtc插件优化,配合webrtc视频墙功能
- gb插件默认开启范围端口
2023-07-14 16:01:57 +08:00
langhuihui
e5c9cacd8b fix:
- data track push data panic
- g711 new track attach block
- didn't stop all publisher and subscriber when rtmp closed
- ps-plugin audio not enabled

desc:
- 数据轨道写入时引发panic
- 在事件回调中创建g711会导致阻塞
- rtmp关闭时没有停止所有发布者和订阅者
- ps-plugin音频未启用
2023-07-07 15:45:07 +08:00
langhuihui
39c692a255 - feat: Initiate unit testing and benchmark testing for adding streaming publish subscriptions to the project
- fix: panic generated by concurrent creation of streams for publishing and subscribing
- fix: IdleTimeout invalid issue
- fix: read and write concurrency issues caused by subscriber blocking
- Preview plugin fixes the default port for https
- GB28181 plugin PR merge

- 启动工程增加对流的发布订阅的单元测试和基准测试
- 修复发布和订阅并发创建流产生的panic
- 修复IdleTimeout无效问题
- 修复订阅者阻塞导致读写并发问题
- preview插件修复https默认端口
- gb28181插件PR合并
2023-06-30 11:31:23 +08:00
langhuihui
507caa1414 - preview plugin (Jessibuca Pro) WebRTC protocol supports H265 and AAC formats
- WebRTC plugin adds screen sharing test page
- WebRTC plugin push stream test page adds camera selection function
- The engine adds the function of dynamically inserting SEI frames
- The engine transforms DataTrack and MediaTrack, and reuses part of the code to reduce complexity
- The event bus adds the engine initialization completion event
- The default port for connecting to the remote console is changed to 44944
- Fix the problem caused by publishing the same StreamPath at the same time

- preview插件(Jessibuca Pro)WebRTC协议支持H265以及AAC格式
- WebRTC插件增加屏幕分享测试页面
- WebRTC插件推流测试页面增加摄像头选择功能
- ​engine增加动态插入SEI帧的功能
- engine对DataTrack改造,和MediaTrack复用部分代码,减少复杂度
- 事件总线增加引擎初始化完成事件
- 连接远程控制台默认端口更换为44944
- 修复同时发布同一个StreamPath引起的问题
2023-06-17 22:04:08 +08:00
langhuihui
03070c68f6 chroe: gorelease 2023-06-11 15:20:21 +08:00
langhuihui
ec3cd569d1 feat: gb28181 add ptz api and record pause fastforword etc. 2023-06-11 14:48:27 +08:00
langhuihui
a9c433405b -Start the project and introduce the conf directory, adding several common configuration examples
-Customizable favicon.ico
-Adding Pause and Resume methods to Stream in the engine
-The engine introduces sync.Cond to replace the pseudo Spinlock
-Preview plugin introduction jessibuca pro demo
-Jessica plugin introduces support for HTTP/ws-h264/h265 bare streams
-Recording plugin adds a prompt in the log when the file cannot be created
-PS plugin fixes a bug where a single port cannot be reused after use
-Webtransport starts by default through built-in certificate mode

- 启动工程引入conf目录,添加若干常用配置示例
- 可以自定义favicon.ico
- 引擎中Stream增加Pause和Resume方法
- 引擎引入sync.Cond替代伪自旋锁
- 预览插件引入jessibuca pro demo
- jessica插件引入对http/ws-h264/h265 裸流支持
- 录制插件在无法创建文件时日志中增加提示
- ps插件修复一个单端口使用后无法重复使用的bug
- webtransport通过内置证书方式默认启动
2023-06-11 14:11:28 +08:00
langhuihui
ebc7e9001a 1 新增LL-HLS支持
该协议为苹果公司推出的低延迟HLS协议,本次更新新增了对该协议播放支持。
同rtsp库一样,采用了第三方库来实现:**github.com/bluenviron/gohlslib**

1.1 使用方法

通过访问形如http://localhost:8080/llhls/live/test/index.m3u8来播放。
其中**live/test**为streamPath,可以替换成实际的值

1.2 插件配置

在llhls下可以配置http配置,用于修改端口号。插件配置方式可以参考文档

1.3 源码说明

llhls相关代码位于**github.com/Monibuca/plugin-hls** 的 **llhls.go** 中。hls和llhls两个插件共用一个代码仓库,因此引入hls时也同时引入了llhls插件。

2 新增HLS.js测试页面

HLS.js测试页面是将hls.js的编译后的代码嵌入到了hls插件仓库中,以方便调试hls流使用。

2.1 访问地址

http://localhost:8080/hls/index.html

该页面也可以用于测试llhls

3 新增对RTMPS协议支持

该协议为RTMP协议的衍生协议,是在TCP基础上增加了TLS安全加固,原理类似HTTPS。
该协议支持是rtmp插件的增强。需要通过配置TLS端口来开启该功能。

3.1 配置

```yaml
rtmp:
  tcp:
    listenaddrtls: :4443
```

3.2 推流测试
```
ffmpeg -i source -f flv rtmps://localhost:4443/live/test
```
如果配置成443端口,则可以省略端口号

3.3 对外推拉流

已经支持,既可以在配置pull或者push中使用rtmps的远程地址

4 其他更新内容

4.1 优化了HLS纯转发模式的资源消耗

> 当只需要将HLS拉流转发时,可以使用纯转发模式
> 纯转发模式由于不需要解析HLS协议中的TS格式,因此对资源消耗比较小。
> 通过配置HLS插件的 **relaymode: 1**开启

4.2 修复了当开启时光回溯功能时的内存泄漏

具体原因是,在进行时间戳判断时忽略了当时间戳超过最大值时的情况,导致ringbuffer无限扩大
> 所谓时光回溯功能,是指可以缓存较多的数据,以订阅当前画面更早一些的画面
> 通过配置**publish**配置中的**buffertime**来开启时光回溯
> 订阅流时需要指定订阅模式,即需要在订阅时加参数`?mode=2`
> 如果需要修改参数名称(有时可能会有冲突,可以通过配置submodeargname 来改变

4.3 WebRTC插件测试页面运行URL中带有参数

为了更方便测试WebRTC功能,允许在访问测试页面时,带上参数

4.3.1 推流测试页面

**http://localhost:8080/webrtc/test/publish?streamPath=live/test**
可以推送到**live/test**。不传该参数则推送到**live/webrtc**

测试房间功能是也可以带上token参数

4.3.2 播放测试页面

**http://localhost:8080/webrtc/test/subscribe?streamPath=live/test**
可以订阅**live/test**的流。不传该参数则订阅**live/webrtc**

4.4 Stream中增加NeverTimeout属性

该属性设置成true可以是的流不再判断超时,保持流永远存活,其目的是有些流并不会产生AudioTrack和VideoTrack,比如纯转发流,或者Room的用于广播消息的流,此时可以在发布成功后,对流设置这个属性
2023-06-04 23:00:11 +08:00
langhuihui
dd01ce0bc4 1. Modifying the engine Streams global variable to sync.Map increases stability and performance
2. Add record plugin to record raw audio data function
3. Fix security issues where API reading log files may access files outside of the log directory
4. Fix noise issue during GB streaming sound playback
5. Fix a memory leak
6. The GB28181 plugin combines a PR for API query of video recordings and directly returns data, no longer through Channel data
7. GB28181 plugin list returns no more nulls
8. On demand pull and push trigger logic code optimization
9. Debug plugin adds HTTP configuration

1、引擎Streams全局变量修改为sync.Map增加了稳定性和性能
2、录制插件增加录制裸音频数据功能
3、修复API读取日志文件可能访问到日志目录外的安全问题
4、修复GB流声音播放有噪声问题
5、修复一处内存泄漏
6、GB28181插件合并一个PR用于API查询录像直接返回数据,不再通过Channel数据中返回
7、GB28181插件list返回不再出现null
8、按需拉流和推流触发逻辑代码优化
9、debug插件增加HTTP配置
2023-05-25 20:30:31 +08:00
langhuihui
2a89629149 fix: change tracks to sync.Map to void dead lock
fix: ps plugin dump
fix: record plugin nil pointer
feat: config support yaml tag name

修复: 修改tracks为sync.Map,避免死锁
修复: ps插件dump
修复: record插件空指针
特性: 配置支持yaml tag name
2023-05-21 22:20:33 +08:00
langhuihui
555b168cba 1. Add the global configuration item disableall to disable all plugins (a plugin can be individually enabled by configuring its enable)
2. Upgrade dataTrack to customTrack and freely add custom tracks
3. PS plugin adds a forwarding mode configuration item and the ability to pull PS streams through the ws protocol
4. Fix processing errors when dts exceeds the maximum value

1、增加全局配置项disableall 用于禁用全部插件(可通过配置插件的enable来单独开启某个插件)
2、dataTrack升级为customTrack,可自由添加自定义轨道
3、PS插件增加转发模式配置项,增加通过ws协议拉取ps流的功能
4、修复dts超过最大值后的处理错误
2023-05-17 07:49:28 +08:00
langhuihui
f2e0963add 1. Add a new PS plugin, move PS processing logic into it, and provide APIs to connect to PS streams
2. Added idletimeout configuration, which can be used to automatically disconnect after the first idle release
3. Handling situations where subscribers consume too slowly
4. Optimize RTMP plugin and merge write operations
5. Snap plugin adds support for URL parameters
6. Fix plugin reference errors used when publishing monitor plugins
7. The default certificate configuration for the webtransport plugin is local.monibuca.com

1、新增PS插件,将PS处理逻辑移入该插件,并提供API可接PS流
2、新增idletimeout配置,可用于首次发布空闲后自动断开
3、增加订阅者消费过慢的情况处理
4、优化rtmp插件,合并写入操作
5、snap插件增加对url参数的支持
6、修复monitor插件发布时使用的插件引用错误
7、webtransport插件默认的证书配置采用local.monibuca.com
2023-05-14 17:24:17 +08:00
langhuihui
326b4f5252 update readme 2023-05-05 18:32:34 +08:00
langhuihui
f4b4d9cb57 支持EnhancedRTMP——现可以接受OBS的H265的推流
GB插件对端口配置新增一个port配置项,可用于代替老的端口配置项
GB插件减少一处Bye引起的阻塞
2023-05-04 10:22:50 +08:00
langhuihui
0cea8a3433 1、支持读取mp4文件发布为流的能力
2、Subscribe增加Internal配置,可修改订阅者是否为内部订阅者
3、防止record插件在开始录制时阻塞事件总线
4、snap插件增加http配置,以自定义端口
5、修复一处因并发回收引起的崩溃
6、修复内置鉴权逻辑
2023-04-29 22:17:59 +08:00
langhuihui
146245c50d 1、增加内置鉴权机制(同腾讯云)
2、增加trace级别日志功能
3、修复rtsp转发webrtc部分流无法播放的问题
4、上个版本漏发了hdl插件更新
5、修复上个版本一处打印忘记去除
6、hls插件修改为暂时只接受AAC格式音频
2023-04-24 14:22:20 +08:00
langhuihui
65283c995d 1、新增环境变量覆盖配置功能
2、rtsp插件依赖库(gortsplib)升级到v3.2.1
3、rtsp插件修复对高码率流的推拉卡顿花屏问题
4、hdl插件拉取flv时增加对是否含有有视频的判断
5、修复hls关闭时出现高CPU的问题,以及close后仍然拉流问题
6、修复播放rtmp可能引起崩溃以及复推引起的内存泄露
7、兼容偶尔时间戳不对的情况
2023-04-23 11:29:10 +08:00
langhuihui
84d9e05409 1、修复engine打印流程超时日志序列化错误的问题
2、修复monitor插件订阅时引起的流的事件循环阻塞问题
3、修复webrtc插件iceserver配置未生效的问题
4、rtsp插件删除协议自动切换逻辑,改为第三方库自动切换
5、pull配置新增代理配置,对hdl和hls插件有效
6、hls插件增加转发模式配置,实现纯转发功能
2023-04-15 08:54:35 +08:00
dexter
248eefd1b0 1 修复热更新api导致的崩溃问题
2 兼容ts中streamID不在标准中定义的情况
   3 修复按需拉流中无音频时订阅者等待的问题
   4 gb插件修复收到已连接的设备的注册包的情况
   5 record插件flv头中添加meta信息
2023-04-09 12:54:49 +08:00
dexter
c95dbfb291 1、新增monitor插件,用于将监控数据写入文件中,方便后续分析
远程控制台已增加监控数据查看功能
2、增加日志多语言机制
3、engine中增加日志语言配置,默认使用zh即中文
4、engine中增加心跳时间广播,并增加心跳事件间隔配置,默认为5秒
2023-04-04 20:58:07 +08:00
dexter
e65da00dac 将常见问题加入注释 2023-03-28 20:48:19 +08:00
dexter
5a436e0965 1、修复上一个版本出现的订阅者限速失效的 bug(影响秒开)
2、修复 GB28181 接收 TCP 流缓冲为 0 的错误
3、GB28181 现在默认接收 TCP 流
4、GB28181 增加监听网卡地址的配置
5、GB28181 增加同时多路 dump 的功能
6、修复rtmp、rtsp续推后时间戳计算
7、优化 rtsp 推流如果没有音频,订阅者将不再等待音频,实现秒开
8、控制台输出链接信息,常见问题已放在入口文件的注释中。
2023-03-28 20:06:45 +08:00
dexter
4652af0975 1、通过提高时间戳精度修复rtsp推流时间戳精度丢失导致的播放卡问题
2、修复rtsp推流后,webrtc无法播放问题
3、修复由于rtp包组包逻辑问题导致rtsp拉流播放卡顿问题
4、hls插件增加http配置项,可独立设置端口
2023-03-23 09:43:27 +08:00
dexter
ba0c2fbf8e 修复avcc写入时间戳的bug,webrtc插件支持tcp连接方式 2023-03-14 09:37:54 +08:00
dexter
0c714cc258 GB插件引用的rtp从v2改回v1,engine做相应修改
对room和webrtc做了一些修改,针对room的demo进行优化
对preview插件的流列表增加了类型显示
2023-03-13 13:46:37 +08:00
dexter
d9933f0c65 readme改成英文 2023-03-10 14:04:16 +08:00
dexter
10aebe3085 1、预览插件增加对按需拉流信息的罗列
2、引入v3版的ps解包逻辑
3、修复非rtmp系的首个绝对时间戳初始化
4、修复订阅时如果无音频时首个视频帧没有被订阅的bug
2023-03-09 19:48:39 +08:00
dexter
56918b5dd4 1、WebRTC订阅AAC流时将AAC通过DataChannel传输
2、Rtmp协议接收releaseStream时不再回复client
3、优化RTSP的AAC数据的解析
4、修复RTSP出错写日志时Panic的问题
5、engine启动插件循序遵循插件注册顺序
2023-03-04 08:15:15 +08:00
dexter
b9e74c161d 修复gb无法获取通道的问题 2023-03-01 20:14:07 +08:00
dexter
33875ecb3d 修复hls插件panic的问题,和psPublisher的json序列化问题 2023-03-01 10:00:59 +08:00
dexter
eaa39044d4 将ps流接收后发布逻辑移入engine中,frame中新增adts数据 2023-02-28 20:22:00 +08:00
dexter
b01a498688 更新room插件 2023-02-27 18:15:51 +08:00
dexter
dcfb354f8c 1、优化了rtp包写入引擎时的内存复用机制
2、优化了webrtc插件
3、订阅时接收的VideoFrame和AudioFrame增加了track属性方便读取track中的数据
4、优化了push的重连逻辑以及终止重连的判断
5、获取annexb格式时如果是关键帧则自动带上sps等
2023-02-26 11:36:31 +08:00
dexter
52681147d6 修复flv录制时的时间戳,hls写入去除锁 2023-02-22 13:42:11 +08:00
dexter
3cd643fd31 修复webrtc推流错误
webrtc插件增加推流测试页面
HLS插件音视频分离
GB28181插件invite恢复使用通道ID,以及合入PR等
2023-02-21 21:33:13 +08:00
dexter
e6f73e71aa 修复WriteADTS没有写入时间戳的bug
修复webrtc推流时payloadType错误问题
修复GB28181的invite报文格式,以及ps流处理
2023-02-21 08:27:17 +08:00
dexter
9c278864c2 修复MP4录制,gb解析ps重写,rtmp插件握手兼容性 2023-02-20 00:24:06 +08:00
dexter
0b5c36b1c1 1、修复linux下没有生成fatal.log的问题
2、fatal.log现在采用追加方式写入
3、优化HLS(ts文件)内存复用
4、修复rtmp协议在接收推流时时间戳生成错误导致内存泄露等问题
5、修复datatrack没有被广播的bug(引起房间demo无法接收到信息)
2023-02-15 21:21:53 +08:00
dexter
97f7d6a22d 修复WriteTimeout传入时多乘以了Second
修复订阅RTP时无音频是的panic
WriteAVCC传入指针防止意外
2023-02-08 22:38:37 +08:00
dexter
bf18453401 1、引入ClockRate, 用于RTSP的RTP时间戳处理(MPEG2中的时间戳是固定90KHZ)
2、修复控制流Sleep传入的时间单位错误
3、优化TS格式解析内存复用,减少内存分配
4、修复rtmp接续发布功能
5、修复录像插件写入MP4文件时,视频格式错误的问题
6、更新WebTansport的插件的quic-go依赖,用于适配go1.20
2023-02-08 14:26:37 +08:00
dexter
7dc8966d55 1、当发布者离线时没有订阅者时,流的超时时间从1s改为10ms。
2、Track增加离线状态,当发布者离线时,Track状态改为离线状态,当发布者重新上线时,Track状态改为在线状态。
    3、Track在恢复在线后,记录时间戳的差值,保持后续时间戳和之前的连续。
    4、进一步优化订阅者读取音视频同步逻辑。
2023-02-06 14:22:45 +08:00
dexter
9cb7010507 1、增加SErepublish事件表示再次发布成功事件,使得SEPublish事件表示第一次发布成功。
2、修复push时ReConnectCount没有计数增加。
3、使用github.com/quic-go/quic-go v0.32.0版本。
4、修复订阅模式>1时没有从IDR帧开始的问题。
5、RTMP插件修复推流时MessageStreamID没有设置的问题。
6、RTSP插件升级第三方依赖库aler9/gortsplib 到 v2.1.0,并进行适配。
7、Stream中将保存状态变更历史信息。
2023-02-03 21:38:01 +08:00
dexter
8d5c6d6d11 增加时光回溯功能
订阅模式参数
内存回收机制
增加对时间长度的配置
解决首屏渲染无音频问题
修复rtmp对外推拉没有带入参数
修复dts生成时pts超过最大值导致错误的问题
修复rtmp解析时对扩展时间戳的处理
修复几处判空panic问题
2023-02-02 12:46:42 +08:00
dexter
3ead36ccf7 fix: 修复engine一处负优化,增加一个首屏渲染开关 2023-01-22 22:06:08 +08:00
dexter
a4e1f4950d 1.优化Track数据写入流程,调用更清晰自然
2.对Subscribe增加3个配置项,用于指定订阅指定Track时的参数名
3.修复首次写入AbsTime总是从0开始引起的问题
4.修复订阅时,读取音频数据过迟问题
5.修复对外推拉流(rtmp、rtsp)时,异常退出没有关闭远端连接问题
6.修复record和hls收到发布事件后重复订阅问题
2023-01-18 23:28:26 +08:00
dexter
53cc788857 1.将amf0编码器和解码器放到codec/amf.go中
2.对写入avcc音频进行长度判断
3.录制者设置为内部订阅者
4.修复edge插件远程拉取HDL时,初始化错误
5.增加MallocSlice函数用于减少内存复制
6.录制flv写完后对头部进行修改加入关键帧元数据使得播放flv可以拖动进度条
2023-01-16 09:34:09 +08:00
dexter
6b40297c69 1.拉取远端hls流平滑处理,解决卡顿问题。
2.拉流逻辑增加一处判空
3.设置speedlimit默认值从0改为500
4.snap插件的订阅者设置为内部订阅者防止影响自动关闭
5.gb28181的tcp范围端口不再读取ssrc值判断
2023-01-10 09:25:18 +08:00
dexter
f8e50d00f5 注释一处println 2023-01-03 19:34:40 +08:00
dexter
361b0522e1 1.修复Stream序列化循环引用问题
2.实现对subscribe中SubVideoTracks和SubAudioTracks的支持
3.修复读取ts中aac格式数据多次flush问题
4.修复subscribe结束时判断IsClosed调用对象错误
5.增加DefaultYaml功能解决插件默认配置被全局配置覆盖问题
6.修复rtsp插件订阅时参数未传入问题
7.snap插件和record插件采用DefaultYaml默认配置
2023-01-03 19:24:15 +08:00
dexter
27784f0a03 1.修复delayclosetimeout值被覆盖的bug
2.重构流中订阅者集合,减少订阅者对轨道的无效等待
3.实现内部订阅者功能,使得HLS插件不再影响最后一个订阅者离开逻辑
4.破坏性修改:pull配置中pullonstart类型改为map,pullonsubscribe修改为pullonsub,类型改为map
5.rtmp插件增加对远端流rtmps协议的支持,优化握手过程
6.修复gb28181插件对时间戳的处理bug(引起跳秒等问题)
7.hdl插件对重连机制进行优化,对于服务器返回非200的连接不再重连
2022-12-31 22:22:10 +08:00
dexter
34394b99cf 1.增加http配置中的timeout参数,用于设置http响应的超时时间
2.http配置增加自定义中间件功能
3.hdl插件和jessica插件增加对http超时的处理
2022-12-19 13:53:32 +08:00
dexter
f56a6c972c 1.优化远程Pull和Push逻辑,增加日志输出
2.解决Stream中Json序列化循环引用问题
3.引擎增加对订阅者下线的及时响应
4.GB插件增加对AAC格式的推测
2022-12-19 09:47:24 +08:00
dexter
7138565443 engine升级到4.9.0,升级hls、hook、record、room
1.增加鉴权机制(钩子函数调用)
2.去除IO类型的泛型,增加代码可读性
3.引擎增加订阅者下线事件派发
4.增加配置项:鉴权开关、订阅者上下线事件开关、事件总线缓冲大小
5.修复网页无法播放HLS问题(修复TS格式写入PMT的PID值)
6.hook插件增加对订阅者下线的通知
7.record插件修复flv分片录制时的时间戳错误(现从0开始)
8.引擎现默认打开rtp乱序重排
2022-12-15 09:45:13 +08:00
langhuihui
a521c63036 fix: 最后订阅者离开条件判断,edge插件只能拉一路的bug 2022-12-11 15:39:21 +08:00
langhuihui
ed5e7196f7 fix: http-flv远端拉流h265编码格式解析 2022-12-10 22:05:27 +08:00
dexter
664a64a025 🐛 FIX: rtp缓存适配webrtc,修复录制插件重复录制问题以及崩溃报错 2022-12-06 09:33:32 +08:00
dexter
f097e66069 🐛 FIX: GB解决非同一域的目标地址问题,引擎增加SubscribeExist功能 2022-11-30 13:25:28 +08:00
dexter
2e8d4d2f3a 📦 NEW: 加入fMP4格式直播流播放功能 2022-11-27 22:25:58 +08:00
dexter
8bb63c9298 1.发布流首次超时时间随PublishTimeout配置
2.RTP打包较大AAC音频进行分包处理
3.截图插件默认不订阅音频提高速度
4.GB插件优化PS包解析兼容性
5.RTSP插件升级gortsplib版本
6.RTMP插件修复对外推流时流路径的设置
2022-11-17 23:52:14 +08:00
dexter
c0b2a10601 👌 IMPROVE: hls支持h265以及G711,Gb28181支持AAC 2022-11-13 23:55:11 +08:00
dexter
3179b892d6 🐛 FIX: hls的h265格式以及G711支持 2022-11-13 23:36:00 +08:00
dexter
ef3a85ec21 🐛 FIX: 修复h265的TS封装格式,修复RTP打包内存泄露 2022-11-10 20:08:05 +08:00
dexter
1a57aeb2a2 🐛 FIX: rtmp握手协议,SEI帧处理 2022-10-30 11:20:44 +08:00
dexter
85b134d333 👌 IMPROVE: 增加限速设置,修复gb单端口时音频时间戳单位 2022-10-26 11:08:05 +08:00
dexter
9969966b52 🐛 FIX: gb推测视频编码格式时判断错误 2022-10-24 14:21:25 +08:00
dexter
5482ab4157 👌 IMPROVE: 更先进的rtp包乱序重排算法 2022-10-23 19:29:34 +08:00
dexter
6a78440a61 👌 IMPROVE: 优化room插件 2022-10-19 23:37:35 +08:00
dexter
61eaaab78f 🐛 FIX: gb插件dts防止自动生成 2022-10-17 11:40:03 +08:00
dexter
54f01a064c 🐛 FIX: 控制台修改配置文件的功能 2022-10-14 16:54:40 +08:00
dexter
09570a6515 🐛 FIX: 录制功能 2022-10-13 20:08:35 +08:00
dexter
00ff25e173 🐛 FIX: 兼容go1.19 和m1 2022-10-13 18:49:12 +08:00
dexter
f0735d3883 Create FUNDING.yml 2022-10-11 20:03:48 +08:00
dexter
314191abaf update record plugin 2022-10-11 19:32:57 +08:00
dexter
33b5c465b6 🐛 FIX: 修复aac包比较小的情况下导致访问越界问题 2022-10-10 22:10:37 +08:00
langhuihui
2b1bf24fb9 🐛 修复logrotate插件windows下编译失败的bug 2022-10-08 21:46:17 +08:00
dexter
4653f7b511 👌 IMPROVE: 优化对外推流数据结构,优化engine对SSE的支持 2022-10-07 22:44:55 +08:00
dexter
86b16fe3fb 👌 IMPROVE: 远程控制台连接升级为quic协议 2022-10-06 00:07:57 +08:00
dexter
d05bd7bc55 📦 NEW: 新增edge插件,提供简单级联功能 2022-10-03 18:52:47 +08:00
dexter
6f9fe7c646 🐛 FIX: rtmp插件与srs服务器互通的问题 2022-09-24 21:08:06 +08:00
dexter
96d886c7a5 🐛 FIX: hook插件读取配置文件错误 2022-09-19 00:23:16 +08:00
dexter
ca2f69539d 🐛 FIX: gb拉流信令拼接错误 2022-09-16 19:19:00 +08:00
dexter
0fd608aefc 🐛 FIX: engine中订阅关键帧被覆盖问题,gb的ptzcmd中发送的deviceID值问题,acc的rtp包超过一个mtu时的解析问题 2022-09-16 13:40:29 +08:00
dexter
d5e6a517fb 🐛 FIX: dts在无B帧情况下的生成机制修正,gb插件增加设备信息持久化重启实例后可快速恢复 2022-09-12 23:02:01 +08:00
dexter
e035cf0846 👌 IMPROVE: 增加rtsp拉流报错信息,gb插件增加ps流dump功能方便排查错误 2022-09-11 21:15:47 +08:00
dexter
e7ff340c7a 🚀 RELEASE: 修复远端拉流保存并发问题,修复gb拉流PS包解析bug,导出部分插件 2022-09-04 22:23:40 +08:00
dexter
91d1d5502b Merge pull request #66 from dwdcth/patch-1
删除"## Changelog"
2022-09-02 16:00:01 +08:00
banshan
b1ef460af1 删除"## Changelog" 2022-09-02 15:53:08 +08:00
dexter
87f08066e5 API增加获取远端导入的流以及向远端推流的信息 2022-08-28 22:36:44 +08:00
dexter
da69aae5fa 修复gb插件中的pts和dts覆盖bug,兼容rtsp协议sdp中无sps和pps问题 2022-08-21 19:35:56 +08:00
dexter
6e8081a411 1、增加配置日志级别;2、发布者增加可以配置断线延迟退出时间配置 2022-08-13 18:33:02 +08:00
dexter
2f7bc14986 Merge pull request #63 from dwdcth/v4
添加版本号
2022-08-09 16:56:47 +08:00
hetangj
504e22b558 添加版本号 2022-08-09 16:43:01 +08:00
hetangj
c7b2cbfee3 '添加版本号' 2022-08-09 16:20:01 +08:00
dexter
70b5c553b9 修复数据轨道释放导致读取错误,以及写入annexb格式时的dts生成问题 2022-08-07 19:12:38 +08:00
dexter
4486c612e4 对rtmp协议写入数据增加判空逻辑 2022-07-30 16:22:44 +08:00
dexter
29f574ae73 增加10s的fps和bps历史统计,rtsp插件增加拉流时强制指定协议的配置,修复若干bug 2022-07-24 00:15:43 +08:00
dexter
d12052eb4a 修复gb28181插件ssrc取值以及ip获取的兼容性 2022-07-17 14:04:01 +08:00
dexter
7a0964b501 Merge branch 'v4' of github.com:langhuihui/monibuca into v4 2022-07-10 20:47:40 +08:00
dexter
67ad3e669d 更新gb插件以及远程控制台显示数据部分 2022-07-10 20:47:11 +08:00
dexter
6c78c2f456 Merge pull request #60 from dwdcth/v4
保存发布信息
2022-07-06 15:39:59 +08:00
banshan
16cf7725f3 保存发布信息 2022-07-06 15:35:26 +08:00
dexter
9d08fa47b3 修复startTime经过json序列化后变成负数的问题 2022-07-06 10:13:02 +08:00
dexter
9b6e9bfbec Merge pull request #59 from dwdcth/v4
修复goreleaser 发布时编译错误
2022-07-06 10:11:32 +08:00
banshan
a18fc77b8b Update go.yml 2022-07-06 09:39:46 +08:00
dexter
edd7a6f047 消除一个hls的内存泄露,修复gb插件的一个bug 2022-07-05 10:24:45 +08:00
dexter
9ec70f0454 升级engine 2022-06-29 14:23:04 +08:00
dexter
6ca479371e 修复若干bug 2022-06-27 00:41:32 +08:00
dexter
f65bd3a760 rtp相关追帧完成,修复音频数据写入bug 2022-06-25 20:53:25 +08:00
dexter
91a9171c5c preview插件加入索引页面,engine的api/plugins输出完整配置信息 2022-06-23 00:47:17 +08:00
dexter
0b51fecf48 snap插件更新 2022-06-20 13:25:50 +08:00
dexter
493bce72cb 取消flv补完,跳帧后的时间戳修复 2022-06-20 13:11:31 +08:00
dexter
a48057e713 更新engine依赖 2022-06-17 10:39:31 +08:00
dexter
2dd008d960 新增预览插件和截图插件,录像插件增加裸流保存功能 2022-06-12 15:51:04 +08:00
wancheng1990
3f7e7b3666 Update config.yaml 2022-06-08 16:29:55 +08:00
dexter
0791151557 quic-go版本不兼容 2022-06-08 13:26:08 +08:00
dexter
69f5d9d976 修复webrtc交互错误 2022-06-08 10:25:10 +08:00
dexter
dec17c1f26 gb28181默认mediaip取sipip配置,修复webrtc插件以及record插件报错 2022-06-05 21:56:59 +08:00
dexter
e6069322f8 修复大量bug,record增加分片录制能力,hls写盘功能移入record插件中 2022-05-31 11:16:14 +08:00
dexter
36ede9b9a2 fix: hls插件拉流panic错误 2022-05-16 19:02:41 +08:00
dexter
e4bc0ad5ea Merge pull request #51 from dwdcth/patch-3
Update go.yml
2022-05-16 10:14:38 +08:00
banshan
33a58b0641 Update go.yml 2022-05-16 10:12:50 +08:00
dexter
cb71b2c7e2 Merge pull request #50 from dwdcth/patch-1
Update go.yml
2022-05-15 21:24:11 +08:00
banshan
38b8923e6f Update go.yml 2022-05-15 21:20:41 +08:00
dexter
8b483e5139 升级插件版本 2022-05-15 19:12:30 +08:00
dexter
34c21e5e8f 尝试发布beta 2022-05-15 16:30:44 +08:00
dexter
b8a23517ba Merge pull request #48 from dwdcth/v4
publish langhuihui/m7s-import
2022-05-15 11:22:58 +08:00
banshan
d491b6206a publish langhuihui/m7s-import 2022-05-04 21:34:07 +08:00
dexter
93ce7391a5 Merge pull request #46 from dwdcth/v4
V4 自动发布和readme
2022-04-25 09:23:39 +08:00
dwdcth
611bd78b5c readme 2022-04-24 11:38:12 +08:00
dwdcth
b112187125 go.yml 2022-04-24 11:16:45 +08:00
dwdcth
e0c35fce2b v4 自动发布 2022-04-24 11:04:31 +08:00
banshan
7bcf2cba27 Update go.yml 2022-04-24 10:31:43 +08:00
dexter
da5f970067 Merge pull request #44 from dwdcth/v4
darwin and windows arm64
2022-04-24 09:41:51 +08:00
dwdcth
711b4cc82c darwin and windows arm64 2022-04-23 21:39:01 +08:00
dexter
f1bcb6f2c9 删除二进制文件 2022-04-08 16:18:39 +08:00
dexter
306a7ffeff 加入WebTransport插件 2022-04-08 16:07:00 +08:00
dexter
9c8a2c5d83 加入log和rtsp两个插件引入 2022-03-22 09:26:07 +08:00
dexter
1a67f63932 更新包路径 2022-02-27 21:47:51 +08:00
dexter
c761c6ce9b 简化代码 2022-02-23 17:34:26 +08:00
dexter
cc9c0d67e2 调试rtmp插件 2022-02-19 10:39:38 +08:00
dexter
6df2a3b842 修复window编译错误 2022-01-16 23:57:45 +08:00
dexter
c38bd36ecc 修复rtsp插件和webrtc插件的bug,windows环境下实现错误写入fatal.log的功能 2022-01-16 13:17:52 +08:00
dexter
a769f1cbf4 修复启动时版本显示不对的问题 2022-01-10 09:11:33 +08:00
dexter
8ec0515f60 hls增加过滤功能,以及永久m3u8文件生成 2022-01-06 14:45:47 +08:00
dexter
e2113e03df 解决rtp包含多slice的情况 2022-01-03 22:52:46 +08:00
dexter
56bbc0ddf8 支持配置文件保存功能,增加HDL拉取远端FLV流的功能 2021-12-27 21:12:05 +08:00
dexter
563f966fe4 修复engine中stream在publish的时候有空指针错误 2021-12-20 13:45:41 +08:00
dexter
0e3befd285 rtsp列表API修复 2021-12-13 10:21:54 +08:00
dexter
e60871b55b 增加查看流数据的功能 2021-12-11 20:07:05 +08:00
dexter
785be6a939 修复gb28181中音频时间戳换算 2021-12-02 11:31:16 +08:00
dexter
7684856ccc 修复gb插件乱序重排功能,对sps加强判断 2021-11-30 16:15:56 +08:00
dexter
2e76b74e74 增加RTP乱序重排,修复接收rtsp h265的推流、rtsp时间戳修复 2021-11-28 23:33:37 +08:00
dexter
e67b3f3bc8 修复timebase为0的情况 2021-11-24 13:51:22 +08:00
dexter
c17302a8fc 针对rtp包的B帧解析优化 2021-11-23 12:54:32 +08:00
dexter
02738a1482 rtsp库更换为gortsplib 2021-11-19 22:06:36 +08:00
dexter
0e1fe9a713 增加延时自动取消发布,gb28181增加tcp多端口监听功能 2021-11-13 15:26:26 +08:00
dexter
8a059c51a9 修复HLS时长浮点计算问题,以及webrtc插件依赖问题 2021-11-04 10:32:28 +08:00
dexter
07a34d2642 修复pushbytestream的bug以及gb28181插件对sip消息的from字段判空 2021-11-01 20:55:15 +08:00
dexter
7dca6c9411 修复引擎bug 2021-10-27 21:52:49 +08:00
dexter
eddbb35136 版本升级 2021-10-13 23:12:11 +08:00
dexter
65c3d90275 更新版本 2021-08-30 15:32:25 +08:00
dexter
531bcd57f1 更新版本 2021-08-22 23:32:36 +08:00
dexter
18bbedcff5 Merge branch '3.0' of github.com:langhuihui/monibuca into 3.0 2021-08-20 23:01:55 +08:00
dexter
6a2818916a 迁移UI到gateway插件中 2021-08-20 22:59:40 +08:00
wancheng1990
612501a403 更新ui 2021-08-19 13:54:39 +08:00
dexter
ca3397e544 Update go.yml 2021-08-18 16:47:58 +08:00
dexter
d01d254caa Update go.yml 2021-08-18 16:44:32 +08:00
dexter
7574a6ba6f 升级webrtc和hls版本 2021-08-16 21:20:19 +08:00
dexter
4c918df6e6 Merge branch '3.0' of github.com:langhuihui/monibuca into 3.0 2021-08-16 14:01:31 +08:00
dexter
f677beb2b7 升级到3.3.1 2021-08-16 14:01:22 +08:00
bosscheng
3adaedf6fc update ui 2021-08-07 00:08:25 +08:00
dexter
5a9cf53485 更新rtsp版本 2021-08-04 20:12:49 +08:00
dexter
bff77f1365 Merge branch '3.0' of github.com:langhuihui/monibuca into 3.0 2021-08-03 15:38:51 +08:00
dexter
b608c38aec 更新rtsp说明以及减少summary消息包大小 2021-08-03 15:38:46 +08:00
bosscheng
d8537ec3a3 update ui 2021-08-02 21:13:14 +08:00
dexter
c055f7fceb 更新版本优化gb28181 2021-08-02 09:03:21 +08:00
dexter
afb0efb2ee 版本升级 2021-07-31 16:25:22 +08:00
dexter
51832cd9a7 对两种ringbuffer采取不同策略 2021-07-29 14:46:59 +08:00
langhuihui
454e19f8c0 更新引擎版本 2021-07-23 20:56:16 +08:00
wancheng1990
62111b41d1 update ui 2021-07-22 16:00:48 +08:00
wancheng1990
0eca8fd657 update ui 2021-07-22 13:54:05 +08:00
langhuihui
ca16d405d0 修改默认配置 2021-07-20 16:59:49 +08:00
wancheng1990
e1d500447a update ui 2021-07-20 16:08:45 +08:00
wancheng1990
e7da10649c update ui 2021-07-20 15:36:19 +08:00
李宇翔
ccd0320090 更新版本 2021-07-13 09:24:01 +08:00
bosscheng
ee9d4d06b4 update ui 2021-07-12 23:11:53 +08:00
langhuihui
089cc593be 更新版本 2021-07-12 09:43:02 +08:00
bosscheng
9abd76b1e5 更新最新ui 2021-07-11 16:46:23 +08:00
langhuihui
6e65cc20a2 3.1.1 2021-07-11 10:49:38 +08:00
wancheng1990
ff71c7bd5a update ui audo play audio 2021-07-08 11:56:36 +08:00
wancheng1990
8648f2ae20 update ui 2021-06-30 18:27:57 +08:00
langhuihui
70e7fae954 更新GB28281版本 2021-06-29 14:09:17 +08:00
langhuihui
48b7ff1dee 更新版本 2021-06-28 23:48:30 +08:00
langhuihui
d46e0d45b2 更新版本 2021-06-27 08:18:29 +08:00
wancheng1990
5b41f67b80 update ui 2021-06-26 23:27:08 +08:00
wancheng1990
3a8b371560 update ui 2021-06-23 11:35:50 +08:00
langhuihui
8abae09574 更新版本 2021-06-18 22:00:58 +08:00
wancheng1990
476bb4a656 update ui 2021-06-15 17:18:56 +08:00
李宇翔
bf5b4010d7 更新UI和GB28181 2021-06-11 10:57:18 +08:00
李宇翔
8cee5c2c18 版本更新 2021-06-04 11:33:40 +08:00
李宇翔
43632cf852 更新插件版本及UI功能 2021-06-02 08:56:41 +08:00
李宇翔
e4e96f8fc1 更新gb28181插件版本 2021-05-31 08:38:10 +08:00
langhuihui
57acc5f357 更新gb28181插件 2021-05-30 16:40:16 +08:00
langhuihui
23faad4405 更新UI和GB28181 2021-05-26 22:05:06 +08:00
langhuihui
ec86b455a9 更新gb28181插件 2021-05-09 23:48:41 +08:00
langhuihui
f848e90a50 调整gb28181录像播放功能 2021-05-09 23:10:50 +08:00
langhuihui
7d05e4cc6c 更新版本 2021-05-09 21:35:39 +08:00
李宇翔
b66e52a90f 更新UI 2021-05-07 09:12:30 +08:00
langhuihui
da6554f536 修改readMe 2021-05-05 14:11:42 +08:00
langhuihui
2b8e8bca98 打包后传输 2021-05-05 11:38:12 +08:00
langhuihui
9009431a1f 更新git action 2021-05-04 17:19:35 +08:00
dexter
99b9cc674f Update go.yml 2021-05-04 16:35:13 +08:00
dexter
67b338007a Update go.yml 2021-05-04 10:50:43 +08:00
dexter
111ba8aa5a Update go.yml 2021-05-04 10:37:30 +08:00
dexter
d5ab178841 Update go.yml 2021-05-04 03:00:48 +08:00
dexter
3a3dd3c73c Update go.yml 2021-05-04 02:54:59 +08:00
dexter
75865960c6 Update go.yml 2021-05-04 02:44:34 +08:00
dexter
bb4c39886d Update go.yml 2021-05-04 02:29:47 +08:00
dexter
4e92f395bf Update go.yml 2021-05-04 01:55:37 +08:00
dexter
64cf6e609d Create go.yml 2021-05-04 01:35:18 +08:00
langhuihui
65bbb5c04f first commit 2021-05-04 01:08:09 +08:00
李宇翔
b0c6bff8ae 更新到1.16 2021-03-24 20:07:51 +08:00
dexter
439eb0afc0 Update README.md 2021-01-20 20:07:33 +08:00
langhuihui
f7e6c5084c 更新版本增加gb28181 2021-01-11 08:24:24 +08:00
李宇翔
e0f424fd2c 更新一下版本 2020-09-04 21:13:34 +08:00
dexter
98995de88a Merge pull request #6 from mask-pp/bug_fix
hold程序方式
2020-08-13 07:50:15 +08:00
workbase
b5c5976312 Merge branch '2.0' into bug_fix 2020-08-12 11:20:51 +08:00
mask-pp
c6dbda22f9 handle住程序方式 2020-08-12 11:17:48 +08:00
langhuihui
1e78f687d7 更新版本 2020-08-09 22:08:48 +08:00
langhuihui
701b9b63f3 更新二维码 2020-08-02 21:42:46 +08:00
langhuihui
58f134cda1 更新二维码 2020-07-26 21:50:09 +08:00
langhuihui
d772ed3336 更新二维码 2020-07-19 22:02:29 +08:00
langhuihui
fc4f13fa00 修改二维码版本 2020-07-12 22:40:16 +08:00
langhuihui
2ee71755b7 更新二维码 2020-07-05 21:56:19 +08:00
李宇翔
7e165fe9d4 更新版本以及二维码 2020-06-28 15:07:19 +08:00
langhuihui
dd7a2e8dc7 更新二维码 2020-06-21 21:56:41 +08:00
langhuihui
bd7f5249aa 更新二维码和引擎版本 2020-06-14 21:24:07 +08:00
langhuihui
bb9a154a00 修改ReadMe 更新插件版本 2020-06-07 19:57:13 +08:00
李宇翔
e3c7c9514e 更新go module和增加webrtc 2020-06-01 09:23:40 +08:00
李宇翔
b3a485ddfb 更新ReadMe 2020-06-01 09:14:38 +08:00
李宇翔
01a74b245e 修改版本号和二维码 2020-05-25 09:30:13 +08:00
dexter
4482f0232f update qr code 2020-05-18 09:07:37 +08:00
langhuihui
919f7ad78b 修改开源协议为MIT 2020-05-17 14:01:04 +08:00
langhuihui
0c1f1c9770 补充一个插件 2020-05-17 13:58:47 +08:00
31 changed files with 1295 additions and 980 deletions

13
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,13 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: monibuca
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

96
.github/workflows/go.yml vendored Normal file
View File

@@ -0,0 +1,96 @@
name: Go
on:
create:
tags:
- v4*
env:
dest: bin
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 1
- name: Set up Env
run: echo "version=${GITHUB_REF:11}" >> $GITHUB_ENV
- name: Set beta
if: contains(env.version, 'beta')
run: echo "dest=beta" >> $GITHUB_ENV
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.21.8
- name: Cache Go modules
uses: actions/cache@v1
with:
path: ~/go/pkg/mod
key: runner.osgo{ { hashFiles('**/go.sum') } }
restore-keys: ${{ runner.os }}-go-
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
if: success() && startsWith(github.ref, 'refs/tags/')
with:
version: v1.8.3
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# - name: Checkout m7s-import
# uses: actions/checkout@v3
# with:
# repository: langhuihui/m7s-import
# path: m7s-import
# persist-credentials: false # otherwise, the token used is the GITHUB_TOKEN, instead of your personal access token.
# fetch-depth: 0
# - name: Add bin to m7s-import
# if: success() && startsWith(github.ref, 'refs/tags/')
# run: |
# cd m7s-import
# mkdir -p apps/m7s-website/src/public/bin
# cp ../dist/m7s_${{ env.version }}_windows_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_windows_amd64.tar.gz
# cp ../dist/m7s_${{ env.version }}_darwin_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_darwin_amd64.tar.gz
# cp ../dist/m7s_${{ env.version }}_darwin_arm64.tar.gz apps/m7s-website/src/public/bin/m7s_darwin_arm64.tar.gz
# cp ../dist/m7s_${{ env.version }}_linux_amd64.tar.gz apps/m7s-website/src/public/bin/m7s_linux_amd64.tar.gz
# cp ../dist/m7s_${{ env.version }}_linux_arm64.tar.gz apps/m7s-website/src/public/bin/m7s_linux_arm64.tar.gz
# ls apps/m7s-website/src/public/bin
- name: copy
if: success() && startsWith(github.ref, 'refs/tags/')
run: |
mkdir -p bin
cp dist/m7s_${{ env.version }}_windows_amd64.tar.gz bin/m7s_windows_amd64.tar.gz
cp dist/m7s_${{ env.version }}_darwin_amd64.tar.gz bin/m7s_darwin_amd64.tar.gz
cp dist/m7s_${{ env.version }}_darwin_arm64.tar.gz bin/m7s_darwin_arm64.tar.gz
cp dist/m7s_${{ env.version }}_linux_amd64.tar.gz bin/m7s_linux_amd64.tar.gz
cp dist/m7s_${{ env.version }}_linux_arm64.tar.gz bin/m7s_linux_arm64.tar.gz
ls bin
- uses: jakejarvis/s3-sync-action@master
# with:
# args: --acl public-read --follow-symlinks --delete
env:
AWS_S3_ENDPOINT: https://${{ secrets.R2_DOMAIN }}
AWS_ACCESS_KEY_ID: ${{ secrets.R2_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET }}
AWS_S3_BUCKET: monibuca
SOURCE_DIR: 'bin'
DEST_DIR: ${{ env.dest }}
- name: docker build
if: success() && startsWith(github.ref, 'refs/tags/')
run: |
tar -zxvf bin/m7s_linux_amd64.tar.gz
mv m7s monibuca_linux
docker login -u langhuihui -p ${{ secrets.DOCKER_PASSWORD }}
docker build -t langhuihui/monibuca:latest .
docker push langhuihui/monibuca:latest
- name: docker push
if: success() && !contains(env.version, 'beta')
run: |
docker tag langhuihui/monibuca:latest langhuihui/monibuca:${{ env.version }}
docker push langhuihui/monibuca:${{ env.version }}

20
.gitignore vendored
View File

@@ -4,4 +4,22 @@
resource
*.log
/monibuca
node_modules
node_modules
shutdown.bat
*.sh
.m7s
debug.go
dist/
record/
config2.yaml
config1.yaml
monibuca_*
ps
ps2
ps3
devices.json
dump
.DS_Store
main
monitor
.history

34
Dockerfile Normal file
View File

@@ -0,0 +1,34 @@
# Compile Stage
FROM golang:1.22.2-alpine3.19 AS builder
MAINTAINER monibuca <awesome@monibuca.com>
LABEL stage=gobuilder
# Env
ENV CGO_ENABLE 0
ENV GOOS linux
ENV GOARCH amd64
#ENV GOPROXY https://goproxy.cn,direct
ENV HOME /monibuca
COPY . /monibuca
WORKDIR /monibuca
# compile
RUN go mod download
RUN go build -ldflags="-s -w" -o /monibuca/build/monibuca ./main.go
RUN cp -r /monibuca/config.yaml /monibuca/build
RUN cp -r /monibuca/favicon.ico /monibuca/build
# Running Stage
FROM alpine:latest
WORKDIR /monibuca
COPY --from=builder /monibuca/build /monibuca/
# Export necessary ports
EXPOSE 8080 8443 1935 554 58200-59200 5060 8000-9000
EXPOSE 5060/udp 58200-59200/udp 8000-9000/udp
CMD [ "./monibuca" ]

695
LICENSE
View File

@@ -1,674 +1,21 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
The MIT License (MIT)
Copyright (c) 2019-present, dexter
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

209
README.md
View File

@@ -1,95 +1,140 @@
<p align="center">
<a href="https://m7s.live">
<img src="logo.png" height="96">
</a>
</p>
<p align="center">
<a href="https://monibuca.com/doc">中文文档</a>
</p>
# Core code base and plug-in code base
<h2 align="center">
<img src="https://monibuca.com/img/logo.b5357057.png"></h2>
[https://github.com/Monibuca](https://github.com/Monibuca)
# Introduction
🧩 Monibuca is a Modularized, Extensible framework for building Streaming Server.
- Customize the server by combining function plug-ins.
- It's easy to develop plug-ins to implement business logic.
- Reduce enterprise development cost and improve development efficiency
## What is Monibuca (m7s)?
# Quick start
Monibuca (pronounced: analog not card, m7s is its abbreviation, similar to k8s) is an open source streaming server development framework developed in Go. It is based on go1.19+, in addition to no other dependencies built, and provides a set of plug-in secondary development model to help you efficiently develop streaming media servers, you can directly use the official plug-in, or develop your own plug-in to extend any function, so Monibuca is a framework that can support any streaming protocol!
## Go has not been installed
Monibuca consists of three parts: engine, plugins, and instance project.
The engine provides a common streaming data cache and forwarding mechanism, and does not care how the protocol is implemented
The plugins offer all the other features and can be extended indefinitely
An instance project is a project project that introduces the engine and plugins and starts the engine, and can be written entirely by yourself
## Plug-in framework
Monibuca aims to build a general streaming media development ecosystem, so since the v1 version, it has considered the decoupling of services and stream forwarding, so as to design a set of plug-in mechanisms that can be arbitrarily extended. Depending on your needs, you can flexibly introduce different types of plugins:
- Provide streaming media protocol packaging/unpacking, such as RTMP plug-ins, RTSP plug-ins, etc
- Provides log persistence processing - logrotate plugin
- Provide recording function - record plugin
- Provide rich debugging functions - debug plugin
- Provide HTTP callback capability - hook plugin
If you are an experienced developer, then the best way is to carry out secondary development on the basis of existing plugins, and provide reusable plugins to more people to enrich the ecosystem. If you're a beginner in streaming, the best way to do this is to use existing plugins to cobble together the features you need and ask experienced developers for help.
# Key features
## Engine aspect
- Provides a plug-in mechanism to manage plug-in startup, configuration resolution, event distribution, etc. in a unified manner
- Provide forwarding in H264, H265, AAC, G711 format
- Provide reusable AVCC format, RTP format, AnnexB format, ADTS format and other pre-encapsulation mechanisms
- Provides a multi-track mechanism, supports large and small streams, and encrypts stream expansion
- Provide DataTrack mechanism, which can be used to implement functions such as room text chat
- Provide timestamp synchronization mechanism and speed limit mechanism
- Provides an RTP packet reorder mechanism
- Provide subscriber frame chasing and skipping mechanism (first screen second on)
- Provides the infrastructure for publish-subscribe push and pull out
- Provides underlying architecture support for authentication mechanisms
- Provides a memory reuse mechanism
- Provides a mechanism for publishers to disconnect and reconnect
- Provides an on-demand flow pulling mechanism
- Provides a common mechanism for HTTP service ports
- Provides an automatic registration mechanism for HTTP API interfaces
- Provides HTTP interface middleware mechanism
- Provides structured logs
- Provides flow information statistics and output
- Provides an event bus mechanism that broadcasts events to all plug-ins
- Provides a configuration hot update mechanism
## Plug-in aspect
- Provide RTMP protocol push-pull stream, external push-pull stream (RTMPS supported)
- Provides RTSP push and pull streams and external push and pull streams
- Provides HTTP-FLV protocol to pull streams, pull external streams, and read local FLV files
- Provides streaming of the WebSocket protocol
- Provides HLS protocol to pull streams and pull outflows
- Provides push-pull streams for the WebRTC protocol
- Provides GB28181 protocol push and dump playback analysis capabilities
- Provide support for the Onif protocol
- Provides streaming of WebTransport protocol
- Provides FMP4 protocol for pulling streams
- Provides edge server functionality to implement cascading streaming
- Provide video recording function, support FLV, MP4, HLS, RAW formats
- Provides log persistence by day, hour, minute, second, size, and number of files
- Provide a screenshot function
- Provides HTTP callback function
- Preview features available (integrated with Jessibuca Pro)
- Room function available (video conferencing possible)
- Provide the function of docking with Prometheus
Third-party plugins and paid plugins provide additional functionality and are not listed here.
Inspired by:
- [mp4ff](https://github.com/edgeware/mp4ff) mp4 file format library [@edgeware](https://github.com/edgeware)
- [gosip](https://github.com/ghettovoice/gosip) go sip library [@ghettovoice](https://github.com/ghettovoice)
- [webrtc](https://github.com/pion/webrtc) go library and whole [@pion](https://github.com/pion) team
- [gortsplib](https://github.com/bluenviron/gortsplib) rtsp library [@aler9](https://github.com/aler9)
## Remote console
- Provides multi-instance management
- Provide flow details display
- Provides visual editing of configurations
- Provides visual display of logs
- Provide visual management of plugins
- Provides GB device management
- Provides an interface for dynamically adding remote push-pull flows
- Provide WebRTC background wall function
- Provide multiplayer video demonstrations
# Origin of the name
The word Monibuca is derived from (Monica), and in order to solve the naming problem, three names are used to represent server, player, and streamer. Since Monica, Jessica, and Rebecca all have `卡` words, which is not good for the live broadcast (ca - `卡` means block in Chinese), it was changed to Monibuca, Jessibuca(https://jessibuca.com), and Rebebuca(https://rebebuca.com). (bu-`不` means not)
# Install
- The compiled binary executable files (i.e. green software) of each platform are officially provided, so it can run without installing any other software.
- If you need to compile and start the project yourself, you need to install go1.19 or above.
The official download link of the latest version is provided:
- [Linux](https://download.m7s.live/bin/m7s_linux_arm64.tar.gz)
- [Linux-arm64](https://download.m7s.live/bin/m7s_linux_arm64.tar.gz)
- [Mac](https://download.m7s.live/bin/m7s_darwin_arm64.tar.gz)
- [Mac-arm64](https://download.m7s.live/bin/m7s_darwin_arm64.tar.gz)
- [Windows](https://download.m7s.live/bin/m7s_windows_amd64.tar.gz)
Don't forget to fix the rights chmod +x m7s_xxx_xxx on Linux and Mac.
# Run
## Executable files run directly
- Linux, for example, downloaded to `/opt/m7s_linux_x86`, then `$ cd /opt ' and then `$ ./m7s_linux_x86`
- Similar to Linux and Mac, you may need to modify the executable permissions of the file or double-click to run
- Windows, double-click m7s directly_windows_x86.exe can be started
## Docker
```bash
docker run -id -p 1935:1935 -p 8080:8080 -p 8443:8443 -p 554:554 -p 58200:58200 -p 5060:5060/udp -p 8000:8000/udp -p 9000:9000 langhuihui/monibuca:latest
```
bash <(curl -s -S -L https://monibuca.com/demo.sh)
```
## Go is already installed
1. go get github.com/langhuihui/monibuca
2. $GOPATH/bin/monibuca
3. open your browser http://localhost:8081
4. use ffmpeg or OBS to push video streaming to rtmp://localhost/live/user1
## Self-compiled startup project
1. `git clone https://github.com/langhuihui/monibuca`
2. `cd monibuca`
3. `go run .`
# Advanced
## Self-created startup project
1. go get github.com/Monibuca/monica
2. $GOPATH/bin/monica
3. open your browser http://localhost:8000
4. follow the guide to create your project
You can watch the video tutorial:
# Ecosystem
- [从零启动 m7s V4](https://www.bilibili.com/video/BV1iq4y147N4/)
go to
[https://plugins.monibuca.com](https://plugins.monibuca.com).
to submit your own plugin
- [m7s v4 视频教程——插件引入](https://www.bilibili.com/video/BV1sP4y1g7BF/)
| Project | Description |
|---------| -------------|
|[plugin-rtmp]|rtmp protocol support.push rtmp stream to monibuca.play stream from monibuca.
|[plugin-rtsp]|rtsp protocol support.pull/push rtsp stream to monibuca
|[plugin-hls]|pull hls stream to monibuca
|[plugin-ts]|used by plugin-hls. read ts file to publish
|[plugin-hdl]|http-flv protocol support. pull http-flv stream from monibuca
|[plugin-gateway]|a console and dashboard to display information and status of monibuca ,also can display UI of other plugins
|[plugin-record]|record multimedia stream to flv files
|[plugin-cluster]|cascade transmission of multimedia by cluster network
|[plugin-jesscia]|play multimedia stream through websocket protocol
[plugin-rtmp]: https://github.com/Monibuca/plugin-rtmp
[plugin-rtsp]: https://github.com/Monibuca/plugin-rtsp
[plugin-hls]:https://github.com/Monibuca/hlspplugin
[plugin-ts]:https://github.com/Monibuca/tspplugin
[plugin-hdl]:https://github.com/Monibuca/plugin-hdl
[plugin-gateway]:https://github.com/Monibuca/plugin-gateway
[plugin-record]:https://github.com/Monibuca/plugin-record
[plugin-cluster]:https://github.com/Monibuca/plugin-cluster
[plugin-jesscia]:https://github.com/Monibuca/plugin-jesscia
# Protocol Functions
| Protocol | Pusherpush-->Monibuca |Source-->Monibucapull|Monibuca-->Playerpull|Monibucapush-->Other Server
|---------| -------------|-------------| -------------|-------------|
|rtmp|✔||✔|
|rtsp|✔|✔||
|http-flv|||✔|
|hls||✔|✔|
|ws-flv|||✔|
# Documentation
[http://docs.monibuca.com/en](http://docs.monibuca.com/en).
中文文档:
[http://docs.monibuca.com](http://docs.monibuca.com).
# Contact
wechat group:
![wechat](https://monibuca.com/wechat.png?t=5.11)
# Q&A
## Q: There are so many streaming server projects in the worldwhy need to create Monibuca?
A: Monibuca is different from other streaming servers,that it was created for facilitate secondary development.
## Q: Why use golang?
A: Golang is a greate programming language. It is very suited to build streaming server since streaming server is a kind of IO intensive system. Goroutine is good at doing these jobs. Another important reason of using Golang is that people read the source code or doing secondary development easier.
## Q: What does "Monibuca" mean?
A: No special meaning. Just from monica —— a girl name.
![公众号](https://m7s.live/images/m7s/footer/wx-mp.jpg)

View File

@@ -1,64 +0,0 @@
# 主页
[https://monibuca.com](https://monibuca.com)
# 中文文档
[http://docs.monibuca.com](http://docs.monibuca.com)
# 核心代码库和插件代码库
[https://github.com/Monibuca](https://github.com/Monibuca)
# 本项目为开箱即用的实例demo
## 一键安装golang环境和monibuca的demo
```
bash <(curl -s -S -L https://monibuca.com/demo.sh)
```
## 对于已经安装好golang环境的
1. go get github.com/langhuihui/monibuca
2. linux下执行$GOPATH/bin/monibuca windows下执行%GOPATH%/bin/monibuca
3. 启动后浏览器打开8081端口查看后台界面
4. ffmpeg或者OBS推流到1935端口
5. 后台界面上提供直播预览、录制flv、rtsp拉流转发、日志跟踪等功能
# Monibuca简介
[Monibuca](https://monibuca.com) 是一个开源的流媒体服务器开发框架适用于快速定制化开发流媒体服务器可以对接CDN厂商作为回源服务器也可以自己搭建集群部署环境。 丰富的内置插件提供了流媒体服务器的常见功能例如rtmp server、http-flv、视频录制、QoS等。除此以外还内置了后台web界面方便观察服务器运行的状态。 也可以自己开发后台管理界面通过api方式获取服务器的运行信息。 Monibuca 提供了可供定制化开发的插件机制,可以任意扩展其功能。
⚡高性能
针对流媒体服务器独特的性质进行的优化充分利用Golang的goroutine的性质对大量的连接的读写进行合理的分配计算资源以及尽可能的减少内存Copy操作。使用对象池减少Golang的GC时间。
🔧可扩展
流媒体服务器的个性化定制变的更简单基于Golang语言开发效率更高独创的插件机制可以方便用户定制个性化的功能组合更高效率的利用服务器资源。[插件市场](https://plugins.monibuca.com)
📈可视化
功能强大的仪表盘可以直观的看到服务器运行的状态、消耗的资源、以及其他统计信息。用户可以利用控制台对服务器进行配置和控制。
# 交流微信群
![交流微信群](https://monibuca.com/wechat.png?t=5.11)
# Q&A
## Q流媒体服务器项目有很多为什么要重复发明轮子
A: Monibuca不同于其他流媒体服务器的地方是针对二次开发为目的。多数流媒体服务器是通用型完成特定任务的对于二次开发并不友好。Monibuca开创了插件机制可以自由组合不同的协议或者功能定制化特定需求的流媒体服务器。
## QMonibuca为何采用Golang为开发语言
A因为Golang语言相比其他语言可读性更强代码简单易懂更利于二次开发另外Golang的goroutine特别适合开发高速系统。
## QMonibuca是否使用Cgo或者其他语言依赖库
A没有。Monibuca是纯Go语言开发不依赖任何其他第三方库比如FFmpeg方便二次开发。对部署更友好仅仅需要Golang运行环境即可。
## QMonibuca对环境有什么要求直播流可以在微信里播放吗
AMonibuca是基于Golang开发支持跨平台部署。Monibuca可以用Jessibuca播放器在微信、手机浏览器里面播放视频。也可以通过其他SDK播放RTMP流、其他协议的流。只需要相应的插件支持即可。
## Q: Monibuca的名称有什么特殊含义吗
A: 这个单词来源于Monica莫妮卡是个人名在项目里面也存在这个文件夹。没有特别含义为了解决起名的难题使用了三个名称分别是Monica、Jessica、Rebecca用来代表服务器、播放器、推流器。由于莫妮卡、杰西卡、瑞贝卡都带卡字对直播来说寓意不好所以改为模拟不卡Monibuca、解析不卡Jessibuca、累呗不卡Rebebuca。其中推流器Rebebuca目前尚为公布是改造了的OBS可用于推流H265

9
conf-example/hls.yaml Normal file
View File

@@ -0,0 +1,9 @@
# hls纯转发,即从HLS->HLS
global:
disableall: true
enablertp: false
enableavcc: false
hls:
enable: true
relaymode: 1

7
conf-example/https.yaml Normal file
View File

@@ -0,0 +1,7 @@
# 默认的http端口是8080
# 这里指定8081为https端口
# 本地访问https://local.monibuca.com:8081请配置host文件将127.0.0.1 local.monibuca.com加入到host文件中
global:
listenaddrlts: :8081
certfile: local.monibuca.com_bundle.pem
keyfile: local.monibuca.com.key

6
conf-example/rtmp.yaml Normal file
View File

@@ -0,0 +1,6 @@
# 只包含rtmp关闭其他所有插件,只能用于rtmp的转发
global:
disableall: true
enablertp: false
rtmp:
enable: true

4
conf-example/rtmps.yaml Normal file
View File

@@ -0,0 +1,4 @@
# 开启接受rtmps
rtmp:
tcp:
listenaddrtls: :443

16
conf-example/rtsp.yaml Normal file
View File

@@ -0,0 +1,16 @@
# rtsp 拉流配置
global:
disableall: true # 需要转换其他协议的话需要将disableall设置为false
enableavcc: false # 如果需要转换成rtmp和flv的话需要改成true
publish:
delayclosetimeout: 2s # 无订阅者时2s后关闭拉流
preview:
enable: true
rtsp:
enable: true # 如果disableall为false的话这个可以不需要写
pull:
pullonstart:
rtsp/test: rtsp://localhost:8554/live
pullonsub: # 按需拉流
rtsp/100: rtsp://admin:admin@192.168.0.100/cam/realmonitor?channel=1&subtype=0
rtsp/101: rtsp://admin:admin@192.168.0.101/cam/realmonitor?channel=1&subtype=0

5
conf-example/说明.txt Normal file
View File

@@ -0,0 +1,5 @@
本目录下所有配置文件都是代表某些配置的例子,只是例子!!!
monibuca 不会读取这个目录下的任何文件!!!
monibuca 默认读取的是 config.yaml
请根据需要自行修改 config.yaml
当然也可以通过 -c 命令指定读取的配置文件

View File

@@ -1,21 +0,0 @@
[RTMP]
ListenAddr = ":1935"
[GateWay]
ListenAddr = ":8081"
[Jessica]
ListenAddr = ":8080"
[LogRotate]
Path = "logs"
[Cluster]
ListenAddr = ":2019"
[TS]
Path = "resource"
[Record]
Path = "resource"
[RTSP]
AutoPublish = false
RtspURL = "rtsp://localhost/test"
[HLS]
EnableWrite = false
[HDL]
ListenAddr = ":2020"

10
config.yaml Normal file
View File

@@ -0,0 +1,10 @@
# 支持零配置启动,即无需填写配置默认启用所有的插件。
# 只需要填写需要修改的配置项即可。不需要将所有的配置都填写进来!!。
# 全局配置参考 https://m7s.live/guide/config.html
# 插件配置参考各个插件的文档
# 插件都有一个enable配置如果为false则不启用该插件默认为true即不需要配置。
hls:
enable: false
monitor:
enable: false

10
docker-compose.yaml Normal file
View File

@@ -0,0 +1,10 @@
services:
monibuca:
build:
dockerfile: ./Dockerfile
image: monibuca:v4
restart: unless-stopped
#please use host mode as expose large number of ports will cause docker extremely slow
network_mode: host
volumes:
- ${PWD}/config.yaml:/monibuca/config.yaml

BIN
favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

26
go.gv
View File

@@ -1,26 +0,0 @@
digraph G {
wall[label="翻墙"]
wall2[label="翻墙"]
gateway[label="访问8081"]
proxy[label="export GOPROXY=https://goproxy.io,direct"]
build[label="go build"]
get[label="go get"]
mod[label="go mod init"]
run[label="go run main.go"]
bin[label="./monibuca"]
bin2[label="GOPATH/bin/monibuca"]
clone[label="clone project"]
getDemo[label="go get github.com/langhuihui/monibuca"]
hasGoMod[shape=diamond label="has go.mod"]
clone->hasGoMod
hasGoMod->proxy[label="yes"]
proxy->build
hasGoMod->wall[label="no"]
hasGoMod->mod[label="no"]
mod->proxy
wall->get
get->run
get->build->bin->gateway
run->gateway
wall2->getDemo->bin2->gateway
}

124
go.mod
View File

@@ -1,17 +1,115 @@
module github.com/langhuihui/monibuca
module monibuca
go 1.13
go 1.21
require (
github.com/Monibuca/engine/v2 v2.0.0
github.com/Monibuca/plugin-cluster v1.0.0
github.com/Monibuca/plugin-gateway v1.2.4
github.com/Monibuca/plugin-hdl v1.2.0
github.com/Monibuca/plugin-hls v1.0.0
github.com/Monibuca/plugin-jessica v1.2.2
github.com/Monibuca/plugin-logrotate v1.2.1
github.com/Monibuca/plugin-record v1.0.0
github.com/Monibuca/plugin-rtmp v1.2.2
github.com/Monibuca/plugin-rtsp v1.1.1
github.com/Monibuca/plugin-ts v1.2.1
go.uber.org/zap v1.27.0
m7s.live/engine/v4 v4.15.3
m7s.live/plugin/debug/v4 v4.0.3
m7s.live/plugin/fmp4/v4 v4.0.6
m7s.live/plugin/gb28181/v4 v4.4.6
m7s.live/plugin/hdl/v4 v4.1.11
m7s.live/plugin/hls/v4 v4.3.9
m7s.live/plugin/hook/v4 v4.0.3
m7s.live/plugin/jessica/v4 v4.2.1
m7s.live/plugin/logrotate/v4 v4.0.7
m7s.live/plugin/monitor/v4 v4.0.5
m7s.live/plugin/preview/v4 v4.1.5
m7s.live/plugin/record/v4 v4.4.8
m7s.live/plugin/room/v4 v4.1.1
m7s.live/plugin/rtmp/v4 v4.3.1
m7s.live/plugin/rtsp/v4 v4.3.6
m7s.live/plugin/snap/v4 v4.0.8
m7s.live/plugin/webrtc/v4 v4.2.6
m7s.live/plugin/webtransport/v4 v4.0.11
)
require (
github.com/Eyevinn/mp4ff v0.42.0 // indirect
github.com/bluenviron/gortsplib/v4 v4.8.0 // indirect
github.com/bluenviron/mediacommon v1.9.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deepch/vdk v0.0.27 // indirect
github.com/denisbrodbeck/machineid v1.0.1 // indirect
github.com/discoviking/fsm v0.0.0-20150126104936-f4a273feecca // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ghettovoice/gosip v0.0.0-20231227123312-6b80e2d3e6f7 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect
github.com/glebarez/sqlite v1.11.0 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/gobwas/httphead v0.1.0 // indirect
github.com/gobwas/pool v0.2.1 // indirect
github.com/gobwas/ws v1.3.2 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/husanpao/ip v0.0.0-20220711082147-73160bb611a8 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/logrusorgru/aurora/v4 v4.0.0 // indirect
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a // indirect
github.com/marten-seemann/qpack v0.3.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mcuadros/go-defaults v1.2.0 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/onsi/ginkgo/v2 v2.16.0 // indirect
github.com/pion/datachannel v1.5.5 // indirect
github.com/pion/dtls/v2 v2.2.10 // indirect
github.com/pion/ice/v2 v2.3.13 // indirect
github.com/pion/interceptor v0.1.25 // indirect
github.com/pion/logging v0.2.2 // indirect
github.com/pion/mdns v0.0.12 // indirect
github.com/pion/randutil v0.1.0 // indirect
github.com/pion/rtcp v1.2.14 // indirect
github.com/pion/rtp v1.8.3 // indirect
github.com/pion/sctp v1.8.12 // indirect
github.com/pion/sdp/v3 v3.0.8 // indirect
github.com/pion/srtp/v2 v2.0.18 // indirect
github.com/pion/stun v0.6.1 // indirect
github.com/pion/transport/v2 v2.2.4 // indirect
github.com/pion/turn/v2 v2.1.3 // indirect
github.com/pion/webrtc/v3 v3.2.29 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/q191201771/naza v0.30.48 // indirect
github.com/quangngotan95/go-m3u8 v0.1.0 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.41.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b // indirect
github.com/shirou/gopsutil/v3 v3.24.2 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/stretchr/testify v1.9.0 // indirect
github.com/tevino/abool v1.2.0 // indirect
github.com/tklauser/go-sysconf v0.3.13 // indirect
github.com/tklauser/numcpus v0.7.0 // indirect
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
github.com/yapingcat/gomedia v0.0.0-20240106100545-1b855b02fa0d // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/mock v0.4.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/mod v0.16.0 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/term v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.19.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/driver/mysql v1.5.7 // indirect
gorm.io/gorm v1.25.12 // indirect
m7s.live/plugin/ps/v4 v4.1.6-0.20240913054305-b03e0471fff9 // indirect
modernc.org/libc v1.22.5 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect
modernc.org/sqlite v1.23.1 // indirect
)

483
go.sum
View File

@@ -1,93 +1,428 @@
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Monibuca/engine v1.2.1 h1:TJmC6eZA1lR1MScWgempZLiEZD4T6aY/nn/rlQ9UdK8=
github.com/Monibuca/engine v1.2.1/go.mod h1:WbDkXENLjcPjyjCR1Mix1GA+uAlwORkv/+8aMVrDX2g=
github.com/Monibuca/engine v1.2.2 h1:hNjsrZpOmui8lYhgCJ5ltJU8g/k0Rrdysx2tHNGGnbI=
github.com/Monibuca/engine/v2 v2.0.0 h1:8FjaScrtN8QdbcxO9zZYABMC0Re3I1O1T4p94zAXYb0=
github.com/Monibuca/engine/v2 v2.0.0/go.mod h1:34EYjjV15G6myuHOKaJkO7y5tJ1Arq/NfC9Weacr2mc=
github.com/Monibuca/plugin-cluster v1.0.0 h1:Ont025wGg145gwwL6kX/cy4U9rQRl5sHRTSIWkRp4Zw=
github.com/Monibuca/plugin-cluster v1.0.0/go.mod h1:N3vqJTZAudELxC2HEiZ751u6L+7MzqzyMX4HkoMEb8o=
github.com/Monibuca/plugin-gateway v1.2.4 h1:+dPLhMVFyBUVC22bYQT/3ODvgekdWL8uaz3y3paaSio=
github.com/Monibuca/plugin-gateway v1.2.4/go.mod h1:l+BaE5QZY0Pr92iiIXS67gt2VxcBuOxYyqIGOEGbuFk=
github.com/Monibuca/plugin-hdl v1.2.0 h1:bm5hSa2FhpnHUyuV5dq3IRvADRvbUPX4GA21QLMcMac=
github.com/Monibuca/plugin-hdl v1.2.0/go.mod h1:fdATWSYU8rGoZpzmaRMi/LVVviwEHW5aoYndH54+awQ=
github.com/Monibuca/plugin-hls v1.0.0 h1:gkK/z78S2DaUzwnTpfUmWojqGHnRdHUASW8Krs7UfPo=
github.com/Monibuca/plugin-hls v1.0.0/go.mod h1:XachZty1nFt3Tju8tR0lA4lt5f5MUVWbfYzqqNoEhcA=
github.com/Monibuca/plugin-jessica v1.2.2 h1:1WVh0sjaMzYjhxXoq+Ggi/BbRfPBf/b9SZ8OPKpCgMM=
github.com/Monibuca/plugin-jessica v1.2.2/go.mod h1:EFZD98+ZDQYmROOgYgZ0tz31Y9UKiYXbsiPI2xUpVNQ=
github.com/Monibuca/plugin-logrotate v1.2.1 h1:0WhwGPpDi3n2WkMjXLUSVAwEdGzfw+1wG65FgJQzjdE=
github.com/Monibuca/plugin-logrotate v1.2.1/go.mod h1:bo2zR3H2CuyN2+dbsnZ6IvM+NT87r9H2RptVyyxkvTY=
github.com/Monibuca/plugin-record v1.0.0 h1:GtWMGq07aAE1Qal/sVKla5Wx/tyWHZDtid1N6bTFrKc=
github.com/Monibuca/plugin-record v1.0.0/go.mod h1:POh+M09c+U1YAt6ratoKXahjt8GopEL0k6M8DUXbmAc=
github.com/Monibuca/plugin-rtmp v1.2.2 h1:paKNootI/R6PaYO4E+Cru7q9aZtRwfD78pOzpnkICAs=
github.com/Monibuca/plugin-rtmp v1.2.2/go.mod h1:RSbufAndiyYfeLz4OiZwcGS/UTHCyTDtqvHzvzRQtWE=
github.com/Monibuca/plugin-rtsp v1.1.1 h1:Pc90d+2LgHEUxZoGp9NagJdWxW9QBVtYQ9LuMiQKZpc=
github.com/Monibuca/plugin-rtsp v1.1.1/go.mod h1:ril/EZJyvah8GKGDJeoJYr4CaO5I9cC0M5JeDjS2P7k=
github.com/Monibuca/plugin-ts v1.2.1 h1:Y2QgEal9/ot43QEvtzRkmA8yk+N2uzieAzKuujZJFMs=
github.com/Monibuca/plugin-ts v1.2.1/go.mod h1:MZsdv34Od1Kh1WOkuqIAO/t2irjzW39RMO9WbpFks4g=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk=
github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/Eyevinn/mp4ff v0.42.0 h1:I85b/EDTkP77GsoBL8nRV6sfFKZhAXoP6oJHU8fv6kM=
github.com/Eyevinn/mp4ff v0.42.0/go.mod h1:w/6GSa5ghZ1VavzJK6McQ2/flx8mKtcrKDr11SsEweA=
github.com/bluenviron/gortsplib/v4 v4.8.0 h1:nvFp6rHALcSep3G9uBFI0uogS9stVZLNq/92TzGZdQg=
github.com/bluenviron/gortsplib/v4 v4.8.0/go.mod h1:+d+veuyvhvikUNp0GRQkk6fEbd/DtcXNidMRm7FQRaA=
github.com/bluenviron/mediacommon v1.9.2 h1:EHcvoC5YMXRcFE010bTNf07ZiSlB/e/AdZyG7GsEYN0=
github.com/bluenviron/mediacommon v1.9.2/go.mod h1:lt8V+wMyPw8C69HAqDWV5tsAwzN9u2Z+ca8B6C//+n0=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0=
github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478 h1:Db9StoJ6RZN3YttC0Pm0I4Y5izITRYch3RMbT59BYN0=
github.com/funny/slab v0.0.0-20180511031532-b1fad5e5d478/go.mod h1:0j1+svBH8ABEIPdUP0AIg4qedsybnXGJBakCEw8cfoo=
github.com/funny/utest v0.0.0-20161029064919-43870a374500 h1:Z0r1CZnoIWFB/Uiwh1BU5FYmuFe6L5NPi6XWQEmsTRg=
github.com/funny/utest v0.0.0-20161029064919-43870a374500/go.mod h1:mUn39tBov9jKnTWV1RlOYoNzxdBFHiSzXWdY1FoNGGg=
github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0=
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8=
github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.0.2 h1:CoAavW/wd/kulfZmSIBt6p24n4j7tHgNVCjsfHVNUbo=
github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deepch/vdk v0.0.27 h1:j/SHaTiZhA47wRpaue8NRp7P9xwOOO/lunxrDJBwcao=
github.com/deepch/vdk v0.0.27/go.mod h1:JlgGyR2ld6+xOIHa7XAxJh+stSDBAkdNvIPkUIdIywk=
github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ=
github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
github.com/discoviking/fsm v0.0.0-20150126104936-f4a273feecca h1:cTTdXpkQ1aVbOOmHwdwtYuwUZcQtcMrleD1UXLWhAq8=
github.com/discoviking/fsm v0.0.0-20150126104936-f4a273feecca/go.mod h1:W+3LQaEkN8qAwwcw0KC546sUEnX86GIT8CcMLZC4mG0=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/ghettovoice/gosip v0.0.0-20231227123312-6b80e2d3e6f7 h1:2ENInMa9XHho+1mUM8RZMZomAnfz+qR5v6AS0+TrM8w=
github.com/ghettovoice/gosip v0.0.0-20231227123312-6b80e2d3e6f7/go.mod h1:rlD1yLOErWYohWTryG/2bTTpmzB79p52ntLA/uIFXeI=
github.com/glebarez/go-sqlite v1.21.2 h1:3a6LFC4sKahUunAmynQKLZceZCOzUthkRkEAl9gAXWo=
github.com/glebarez/go-sqlite v1.21.2/go.mod h1:sfxdZyhQjTM2Wry3gVYWaW072Ri1WMdWJi0k6+3382k=
github.com/glebarez/sqlite v1.11.0 h1:wSG0irqzP6VurnMEpFGer5Li19RpIRi2qvQz++w0GMw=
github.com/glebarez/sqlite v1.11.0/go.mod h1:h8/o8j5wiAsqSPoWELDUdJXhjAhsVliSn7bWZjOhrgQ=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU=
github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM=
github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og=
github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=
github.com/gobwas/ws v1.1.0-rc.1/go.mod h1:nzvNcVha5eUziGrbxFCo6qFIojQHjJV5cLYIbezhfL0=
github.com/gobwas/ws v1.3.2 h1:zlnbNHxumkRvfPWgfXu8RBwyNR1x8wh9cf5PTOCqs9Q=
github.com/gobwas/ws v1.3.2/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/husanpao/ip v0.0.0-20220711082147-73160bb611a8 h1:4Jk58quTZmzJcTrLlbB5L1Q6qXu49EIjCReWxcBFWKo=
github.com/husanpao/ip v0.0.0-20220711082147-73160bb611a8/go.mod h1:medl9/CfYoQlqAXtAARmMW5dAX2UOdwwkhaszYPk0AM=
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 h1:bqDmpDG49ZRnB5PcgP0RXtQvnMSgIF14M7CBd2shtXs=
github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/pixelbender/go-sdp v1.0.0 h1:hLP2ALBN4sLpgp2r3EDcFUSN3AyOkg1jonuWEJniotY=
github.com/pixelbender/go-sdp v1.0.0/go.mod h1:6IBlz9+BrUHoFTea7gcp4S54khtOhjCW/nVDLhmZBAs=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA=
github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a h1:3Bm7EwfUQUvhNeKIkUct/gl9eod1TcXuj8stxvi/GoI=
github.com/lufia/plan9stats v0.0.0-20240226150601-1dcf7310316a/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/marten-seemann/qpack v0.3.0 h1:UiWstOgT8+znlkDPOg2+3rIuYXJ2CnGDkGUXN6ki6hE=
github.com/marten-seemann/qpack v0.3.0/go.mod h1:cGfKPBiP4a9EQdxCwEwI/GEeWAsjSekBvx/X8mh58+g=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mcuadros/go-defaults v1.2.0 h1:FODb8WSf0uGaY8elWJAkoLL0Ri6AlZ1bFlenk56oZtc=
github.com/mcuadros/go-defaults v1.2.0/go.mod h1:WEZtHEVIGYVDqkKSWBdWKUVdRyKlMfulPaGDWIVeCWY=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.5/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/pion/datachannel v1.5.5 h1:10ef4kwdjije+M9d7Xm9im2Y3O6A6ccQb0zcqZcJew8=
github.com/pion/datachannel v1.5.5/go.mod h1:iMz+lECmfdCMqFRhXhcA/219B0SQlbpoR2V118yimL0=
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
github.com/pion/dtls/v2 v2.2.10 h1:u2Axk+FyIR1VFTPurktB+1zoEPGIW3bmyj3LEFrXjAA=
github.com/pion/dtls/v2 v2.2.10/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
github.com/pion/ice/v2 v2.3.13 h1:xOxP+4V9nSDlUaGFRf/LvAuGHDXRcjIdsbbXPK/w7c8=
github.com/pion/ice/v2 v2.3.13/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw=
github.com/pion/interceptor v0.1.25 h1:pwY9r7P6ToQ3+IF0bajN0xmk/fNw/suTgaTdlwTDmhc=
github.com/pion/interceptor v0.1.25/go.mod h1:wkbPYAak5zKsfpVDYMtEfWEy8D4zL+rpxCxPImLOg3Y=
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8=
github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk=
github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA=
github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8=
github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL1I=
github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE=
github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4=
github.com/pion/rtp v1.8.2/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
github.com/pion/rtp v1.8.3 h1:VEHxqzSVQxCkKDSHro5/4IUUG1ea+MFdqR2R3xSpNU8=
github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU=
github.com/pion/sctp v1.8.5/go.mod h1:SUFFfDpViyKejTAdwD1d/HQsCu+V/40cCs2nZIvC3s0=
github.com/pion/sctp v1.8.12 h1:2VX50pedElH+is6FI+OKyRTeN5oy4mrk2HjnGa3UCmY=
github.com/pion/sctp v1.8.12/go.mod h1:cMLT45jqw3+jiJCrtHVwfQLnfR0MGZ4rgOJwUOIqLkI=
github.com/pion/sdp/v3 v3.0.8 h1:yd/wkrS0nzXEAb+uwv1TL3SG/gzsTiXHVOtXtD7EKl0=
github.com/pion/sdp/v3 v3.0.8/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M=
github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo=
github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA=
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
github.com/pion/transport v0.14.1 h1:XSM6olwW+o8J4SCmOBb/BpwZypkHeyM0PGFCxNQBr40=
github.com/pion/transport v0.14.1/go.mod h1:4tGmbk00NeYA3rUa9+n+dzCCoKkcy3YlYb99Jn2fNnI=
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc=
github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo=
github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
github.com/pion/transport/v3 v3.0.1 h1:gDTlPJwROfSfz6QfSi0ZmeCSkFcnWWiiR9ES0ouANiM=
github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0=
github.com/pion/turn/v2 v2.1.3 h1:pYxTVWG2gpC97opdRc5IGsQ1lJ9O/IlNhkzj7MMrGAA=
github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY=
github.com/pion/webrtc/v3 v3.2.29 h1:flXjxjlqpp3FjkpSSBKwv7UOfbUvan9+gFY6A5ZaAn4=
github.com/pion/webrtc/v3 v3.2.29/go.mod h1:M+5YSvBDPAkHHRwGXlplIFBQI5mXm6Y4byns1OpiX68=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/q191201771/naza v0.30.48 h1:lbYUaa7A15kJKYwOiU4AbFS1Zo8oQwppl2tLEbJTqnw=
github.com/q191201771/naza v0.30.48/go.mod h1:n+dpJjQSh90PxBwxBNuifOwQttywvSIN5TkWSSYCeBk=
github.com/quangngotan95/go-m3u8 v0.1.0 h1:8oseBjJn5IKHQKdRZwSNskkua3NLrRtlvXXtoVgBzMk=
github.com/quangngotan95/go-m3u8 v0.1.0/go.mod h1:smzfWHlYpBATVNu1GapKLYiCtEo5JxridIgvvudZ+Wc=
github.com/reactivex/rxgo v1.0.0/go.mod h1:/S1ygE20oE1BvZGIwd3fXx/m6s6pOX5G6zmXg9ninlQ=
github.com/shirou/gopsutil v2.20.1+incompatible h1:oIq9Cq4i84Hk8uQAUOG3eNdI/29hBawGrD5YRl6JRDY=
github.com/shirou/gopsutil v2.20.1+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k=
github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM=
github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y=
github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf h1:Z2X3Os7oRzpdJ75iPqWZc0HeJWFYNCvKsfpQwFpRNTA=
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf/go.mod h1:M8agBzgqHIhgj7wEn9/0hJUZcrvt9VY+Ln+S1I5Mha0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tevino/abool v0.0.0-20170917061928-9b9efcf221b5/go.mod h1:f1SCnEOt6sc3fOJfPQDRDzHOtSXuTtnz0ImG9kPRDV0=
github.com/tevino/abool v1.2.0 h1:heAkClL8H6w+mK5md9dzsuohKeXHUpY7Vw0ZCKW+huA=
github.com/tevino/abool v1.2.0/go.mod h1:qc66Pna1RiIsPa7O4Egxxs9OqkuxDX55zznh9K07Tzg=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4=
github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4=
github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY=
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
github.com/yapingcat/gomedia v0.0.0-20240106100545-1b855b02fa0d h1:dbvo9izqyW38pHtBKU0OYa5s+F8Vk1wlYxZ6qbK3nMY=
github.com/yapingcat/gomedia v0.0.0-20240106100545-1b855b02fa0d/go.mod h1:WSZ59bidJOO40JSJmLqlkBJrjZCtjbKKkygEMfzY/kc=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f h1:3CW0unweImhOzd5FmYuRsD4Y4oQFKZIjAnKbjV4WIrw=
golang.org/x/exp v0.0.0-20240314144324-c7f7c6466f7f/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20200425230154-ff2c4b7c35a0/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8=
golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
m7s.live/engine/v4 v4.15.3 h1:9Jx4BdCEfOOl09FoNKgb2wHG3eaeMdZuN2urUWYCwKc=
m7s.live/engine/v4 v4.15.3/go.mod h1:uKxjmsjU1WARUNowEkP83BSrJMUjGwkJrX5nPi6DGmE=
m7s.live/plugin/debug/v4 v4.0.3 h1:lwqKkySXhu47kon/YeF+h5UXXac6c9seb2L6Y8X5ktM=
m7s.live/plugin/debug/v4 v4.0.3/go.mod h1:muzikl1KrHfbT/+2aHzKg9qDGfpArViQAtpcfFrST88=
m7s.live/plugin/fmp4/v4 v4.0.6 h1:X4FXfYuI1OCgaJzyJUNySDRPNPHzLJ5StgX/IxljQIA=
m7s.live/plugin/fmp4/v4 v4.0.6/go.mod h1:0P3IbefEJ6Cs9AeMME0FbEiOK7XNn1fJ5xHohtefIQA=
m7s.live/plugin/gb28181/v4 v4.4.6 h1:04qSdJdiYDnxC2WRT8NU4rQaennBk23E2xJXLPFipTk=
m7s.live/plugin/gb28181/v4 v4.4.6/go.mod h1:H7JcHPXuc97YAomxTnNoTWwicYOyhOX2vkGsSIH8kKc=
m7s.live/plugin/hdl/v4 v4.1.11 h1:HL/nVE9CB2zjjVXrQFlaJPodM8hRXj2xuGBMgv7hn6w=
m7s.live/plugin/hdl/v4 v4.1.11/go.mod h1:wTkYejcTlJzBrdVZnwTYCwsKjDKt5ULTW6J0SuTH6cg=
m7s.live/plugin/hls/v4 v4.3.9 h1:j6n28Xd/aB7x6rdmgmnUbTzCQHAHAJQ4DUFXF/220m8=
m7s.live/plugin/hls/v4 v4.3.9/go.mod h1:TDzIrFhVLsrACy/n0fSSozQQ1TauyFKVwAHmH69fgJk=
m7s.live/plugin/hook/v4 v4.0.3 h1:SDIUQ0lmq9bHfpIcHrvPqwGPad4z0wyI/lIvuYXi/RM=
m7s.live/plugin/hook/v4 v4.0.3/go.mod h1:bX151KQljdzLPAD7sqae4W+bGjTrQ+9i24/Svs2wWDk=
m7s.live/plugin/jessica/v4 v4.2.1 h1:GbQ8V2ElHT7Q/0y1cyXCzw/DvTnqkpP1kCOpVd+0d6Y=
m7s.live/plugin/jessica/v4 v4.2.1/go.mod h1:62tI6vio/PkJhuIbkrIKZm9jAEHwkzXe4Uk1EJaK5iQ=
m7s.live/plugin/logrotate/v4 v4.0.7 h1:se7PPrl75BL38IH83THb826F0KEuGgu0ZYk5bRfTQlE=
m7s.live/plugin/logrotate/v4 v4.0.7/go.mod h1:CKMnlNCxvFT7J+6HvRaQqE/qWV+Ejwvf1EgEN2aH6CE=
m7s.live/plugin/monitor/v4 v4.0.5 h1:NOoCBd8832H0BuTGvtuxGljSxFW3GIMM/gg+5xk8KcA=
m7s.live/plugin/monitor/v4 v4.0.5/go.mod h1:rMERBOcTTTdsVh+rPLjxdM45aAjVSQ+I0kADvUol4J4=
m7s.live/plugin/preview/v4 v4.1.5 h1:/Rrov9W/ZNmbr71FKu0QUDlym8gwVzhX1TIN8DUmDms=
m7s.live/plugin/preview/v4 v4.1.5/go.mod h1:iYhWqFbTvTNDFplbTOrE5X9M6ED7gCKkKMuM5QmBocg=
m7s.live/plugin/ps/v4 v4.1.6-0.20240913054305-b03e0471fff9 h1:X7tU86jQ+IntFooI3N3s0ZX1nVYfqu06NtnvoI38ioQ=
m7s.live/plugin/ps/v4 v4.1.6-0.20240913054305-b03e0471fff9/go.mod h1:iuKvqxDrOSsU87uE2EN+Y/48ju0GNaGvpBKWJXvAuRk=
m7s.live/plugin/record/v4 v4.4.8 h1:FOTY6iU1GbF80q8EnCuihpvZ7P2m4s4VPaJQv05zh2Y=
m7s.live/plugin/record/v4 v4.4.8/go.mod h1:1XbR5scdGl5W2fbDAKB6a3P4jp0ejpVKn2eTWrWHlSw=
m7s.live/plugin/room/v4 v4.1.1 h1:6bPQrvLkCt5C3iak/2ipV59hSkPNfUaptzRuEbfJi+8=
m7s.live/plugin/room/v4 v4.1.1/go.mod h1:k5UKhDuTDXQCjul7GMbnyWXTHhCK59VbGY/UeKJ9Jqs=
m7s.live/plugin/rtmp/v4 v4.3.1 h1:CksvXkCkzKYCY8zQHfs5M7rS3BEAigiN96ljjoUVReE=
m7s.live/plugin/rtmp/v4 v4.3.1/go.mod h1:mV+e240wv/ehJKZSqoMmNm9hkjt+9IFmS5zgPxxm4NE=
m7s.live/plugin/rtsp/v4 v4.3.6 h1:X3zsJRF/GgxXF1kZc3YowMjbEZ6/8un0Kth+/6/RadQ=
m7s.live/plugin/rtsp/v4 v4.3.6/go.mod h1:SHzMp7cqaJlSUDxKAAUYj0gu58nxtxn1/lQnLiH2L6Y=
m7s.live/plugin/snap/v4 v4.0.8 h1:65t4Wd9wiBdD1/ucCSVma5/LhEg/6XbC4yqf95uvCxI=
m7s.live/plugin/snap/v4 v4.0.8/go.mod h1:gVOKn5v2wpKQrklES+nQsaMo6T6ZjfEME7Nz3G51D74=
m7s.live/plugin/webrtc/v4 v4.2.6 h1:/sX9Z9PIXgteL/byS2CMnWuozGnpZXTT8KMp/WQObIQ=
m7s.live/plugin/webrtc/v4 v4.2.6/go.mod h1:Msn2PeL9WJXJbtty+uXoBLcUSkQSRsi4sbEHE9neJHE=
m7s.live/plugin/webtransport/v4 v4.0.11 h1:V1Z7P1tgFojXynFuSWCapVB39+0t5eqmu04+v0IVSME=
m7s.live/plugin/webtransport/v4 v4.0.11/go.mod h1:YvVYfySR9nxgTMLgvh86ylrP4VE59QLq5iAuDwK0tuI=
modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE=
modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM=
modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=

23
goreleaser.yml Normal file
View File

@@ -0,0 +1,23 @@
project_name: m7s
archives:
-
files:
- config.yaml
- favicon.ico
- conf-example/*
builds:
- id: "all"
env:
- CGO_ENABLED=0
ldflags:
- -s -w -X main.version={{.Tag}}
goos:
- linux
- windows
- darwin
goarch:
- arm64
- amd64
hooks:
pre:
- go mod tidy

27
local.monibuca.com.key Normal file
View File

@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA28nTcgJqaNhqE1O/pOhWYXCstILuszRPxVH74fHLBezXrnBw
EaoD7J2/iv7tbG5sW4TF3E85hEuQ7gIjrTliEot58ADvao16y9sxZuYPckMn4nWu
5uc4MWf+8TYQn3cM16yg/e8+Qm9EliaCkXUf42xZCvCJ3ZJ4hW8/2yl+yPeFcAw2
MyG7LzO1s96FqWCaMv6sZAHIAAlyfdvAhuASi5ADL16qCT4+S02GZdSWBkxs1F9Z
4ZMvnw4vbu2zT+WU3eMYIq5Y1MpHve1PPtHqMttZMiISpPFtSiWIhWSZRIYJU8Qd
WCFVAXmkbuKWOG0QB+/N8jlHiZXf2A/BdxY+6wIDAQABAoIBAQC93flqqQmRrzrb
nWKWLBvLK1IW0nEwoEU1OaC1zHJNmQ+tYvZ9W/jt5Ex+38DtBetXmDhxHIOcdMcr
xO9bCpJdYN4i5jvtOXFWP/HKaX34gGkpKe7BDAewLp2/dKwhhe+zNS8SjyWisIp4
h6YN0DeO+J9nYupGXez9oGByjMM5CXiKEMGTfxPs3PCBmAAShpfQgk0uF+qenngP
glexa3kVEQa/30IhxKy7S+E2QzDCKhGHg0cwmoTY0GMrJITQL6dpTT8fjMbv99zq
8tn1xYqXuOrhdnOfl5xX906MV2Zs+lnsn3y/jxR/VzLeO/aixKEyjfOwNTnHwO01
YWyW10OxAoGBAPkqfNR+pAlfK6T4QaeM8fDxcPBE08onIXhiwantF6fIf78wvKUk
di+SD4u+fzx2tuGKey9SyTB48v+QgbQDgdXjis7yGOwtZ6l1FRM6hVZecxPlNsE2
dpzGQFuzlSFOIfuEQz9dA6t9cLBddtL1avqEH91H4q/1yKx/7LblowhzAoGBAOHR
EHv9K8RqWwidJt54bd9xypcZq/SxW72BVTEBII7AuIRYLEWvnYl8OiNJHtlO7Zth
BWAeYREk3JVKLCsMQDBKBR6dHHOJgZtDzc7CTA9x1b6asTC63ESawkTq7LB4JN8n
sbIuzzyAxrHod9GAhD5LwC0VpQ706ZRRF/e05+mpAoGAKsOQCShzHuimpPm2yvr1
y1Sk/ZfSga+VnwPUGUYH+VQAGOBUgENxxVhcMq/PRqFZYfxSiBy9SwR3MEWs/Shc
8EjNWhdTD7X7RKpDo7k3iUtMlO2SKDcgxGeCRDreLYkra++XWxiruJMe9CYWbr6Q
Tc6/aUsdLPYSKwkJp5piEOECgYADVdsweaTT2d5OWkPgtVaqHjwnzzFDA/ue6PIh
LysT8LTI/6RnwxhIl5UkQEg8XXYU/XHe4ZP9dNXtPpM4b43jKLS6pwdsjXNkn7PC
ggwtjjjh/9buKVRnjwGfkvi8AopI4YU2ZIqbEivdJNngNk29vdCw2cj+V4+7qRb5
iaqDQQKBgQCSW9FGXQUSvhDRRJRnbEPN9wQ7d1FO2NdD5Lw1Ztp6jaxMcFIvSYZH
xUE/W2ZW8bIX1RmD3lQx/gyFypMpnQjt09EYPan0YkxbToaviL2dptbSfHzJY4x2
oLKzOUgFJcwvWu5EmIxrbQqzMwn7KK6a/acKbCd8BZWE74T0PCmECA==
-----END RSA PRIVATE KEY-----

View File

@@ -0,0 +1,66 @@
-----BEGIN CERTIFICATE-----
MIIGbzCCBNegAwIBAgIQHmhIdH8Og8ttH4DXNxL8VDANBgkqhkiG9w0BAQwFADBZ
MQswCQYDVQQGEwJDTjElMCMGA1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywg
SW5jLjEjMCEGA1UEAxMaVHJ1c3RBc2lhIFJTQSBEViBUTFMgQ0EgRzIwHhcNMjQw
MzE1MDAwMDAwWhcNMjUwMzE1MjM1OTU5WjAdMRswGQYDVQQDExJsb2NhbC5tb25p
YnVjYS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDbydNyAmpo
2GoTU7+k6FZhcKy0gu6zNE/FUfvh8csF7NeucHARqgPsnb+K/u1sbmxbhMXcTzmE
S5DuAiOtOWISi3nwAO9qjXrL2zFm5g9yQyfida7m5zgxZ/7xNhCfdwzXrKD97z5C
b0SWJoKRdR/jbFkK8IndkniFbz/bKX7I94VwDDYzIbsvM7Wz3oWpYJoy/qxkAcgA
CXJ928CG4BKLkAMvXqoJPj5LTYZl1JYGTGzUX1nhky+fDi9u7bNP5ZTd4xgirljU
yke97U8+0eoy21kyIhKk8W1KJYiFZJlEhglTxB1YIVUBeaRu4pY4bRAH783yOUeJ
ld/YD8F3Fj7rAgMBAAGjggLtMIIC6TAfBgNVHSMEGDAWgBRfOnwREH4MZ3Fh3Iuj
tQADZ/VXHDAdBgNVHQ4EFgQUogMCgGoLmqKdA85J6VQNFyXoGT8wDgYDVR0PAQH/
BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF
BwMCMEkGA1UdIARCMEAwNAYLKwYBBAGyMQECAjEwJTAjBggrBgEFBQcCARYXaHR0
cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQIBMH0GCCsGAQUFBwEBBHEwbzBC
BggrBgEFBQcwAoY2aHR0cDovL2NydC50cnVzdC1wcm92aWRlci5jbi9UcnVzdEFz
aWFSU0FEVlRMU0NBRzIuY3J0MCkGCCsGAQUFBzABhh1odHRwOi8vb2NzcC50cnVz
dC1wcm92aWRlci5jbjAdBgNVHREEFjAUghJsb2NhbC5tb25pYnVjYS5jb20wggF/
BgorBgEEAdZ5AgQCBIIBbwSCAWsBaQB2AM8RVu7VLnyv84db2Wkum+kacWdKsBfs
rAHSW3fOzDsIAAABjj+wthwAAAQDAEcwRQIgTQMQ/9JweDjGa5QXZc5jeH5Hnz/J
Wl+OTn1Wp4G9++kCIQD+CA6b1mPvaEPMSfmV/5pN3+sicf6zTnKf5dRMXKf7mgB3
AKLjCuRF772tm3447Udnd1PXgluElNcrXhssxLlQpEfnAAABjj+wtbQAAAQDAEgw
RgIhAMy6b3sTpZOVTqxRdWQjBUHmoansaX6JtjM9C0uFfFh+AiEA8/XTOYmriI2R
9XMC+xonX7j4dBauKeSoEfWhJYxPclIAdgBOdaMnXJoQwzhbbNTfP1LrHfDgjhuN
acCx+mSxYpo53wAAAY4/sLXxAAAEAwBHMEUCIHaNFmIIU4O1rUOpRMud3M4StKRb
qHAneb/w/pHU/sjeAiEA7/yVlvTiq+j3Lxx4ejyRcIUBNJwiY3XGsIYQ+UPOv30w
DQYJKoZIhvcNAQEMBQADggGBADK5qeh0KTL12nFm7w6h8Y6L0l/93uHe8rzYI9hU
JjhVQur99Kk5Ak5p/j4SQWUkrkg6iOSfMe1mXUKh74nJxf2SImqG5oJhMY8g6vPR
3fUlWHx5ekljPeRHaS0TJeJfWOMVlcZhyJVgtGuQgVLQujHswSvqS8eB4MEtZiQd
kEBxWw75HWvr6Y4/oA4v5e9rIOy89t5T1jWfuH/zK9Gx5fKypPRl7n8fM9pyDQOF
XiYZnfx+5X+eGHS1w8Vhl5mKZPuMaGZtdf5gcHAj25C5PtuEIQKeV5ectgYj838F
UZCasWdR2QphrUBudnUW5ypuQHI4x1FSeYrOWU41eiXLfDsJ8LauM9AcJOtO4/NI
jfQHZ4WY+NnUGRk/1fQZ/aoEJ06aJ6uUkiJ15udXDeifTPQkorRNMlOVykAxfQoa
PAajAU/Mi4UxIB7nehp0jqC9KrS4Ol7S1NXEHTP7DQQMEkCZbexBQy4OLzE+l7XT
P710Esdx5eHD8jhLRS9Aynx32g==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA++gAwIBAgIRALIM7VUuMaC/NDp1KHQ76aswDQYJKoZIhvcNAQELBQAw
ezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0yMjAxMTAwMDAwMDBaFw0y
ODEyMzEyMzU5NTlaMFkxCzAJBgNVBAYTAkNOMSUwIwYDVQQKExxUcnVzdEFzaWEg
VGVjaG5vbG9naWVzLCBJbmMuMSMwIQYDVQQDExpUcnVzdEFzaWEgUlNBIERWIFRM
UyBDQSBHMjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKjGDe0GSaBs
Yl/VhMaTM6GhfR1TAt4mrhN8zfAMwEfLZth+N2ie5ULbW8YvSGzhqkDhGgSBlafm
qq05oeESrIJQyz24j7icGeGyIZ/jIChOOvjt4M8EVi3O0Se7E6RAgVYcX+QWVp5c
Sy+l7XrrtL/pDDL9Bngnq/DVfjCzm5ZYUb1PpyvYTP7trsV+yYOCNmmwQvB4yVjf
IIpHC1OcsPBntMUGeH1Eja4D+qJYhGOxX9kpa+2wTCW06L8T6OhkpJWYn5JYiht5
8exjAR7b8Zi3DeG9oZO5o6Qvhl3f8uGU8lK1j9jCUN/18mI/5vZJ76i+hsgdlfZB
Rh5lmAQjD80M9TY+oD4MYUqB5XrigPfFAUwXFGehhlwCVw7y6+5kpbq/NpvM5Ba8
SeQYUUuMA8RXpTtGlrrTPqJryfa55hTuX/ThhX4gcCVkbyujo0CYr+Uuc14IOyNY
1fD0/qORbllbgV41wiy/2ZUWZQUodqHWkjT1CwIMbQOY5jmrSYGBwwIDAQABo4IB
JjCCASIwHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYDVR0OBBYE
FF86fBEQfgxncWHci6O1AANn9VccMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8E
CDAGAQH/AgEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAiBgNVHSAE
GzAZMA0GCysGAQQBsjEBAgIxMAgGBmeBDAECATBDBgNVHR8EPDA6MDigNqA0hjJo
dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNy
bDA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmNvbW9k
b2NhLmNvbTANBgkqhkiG9w0BAQsFAAOCAQEAHMUom5cxIje2IiFU7mOCsBr2F6CY
eU5cyfQ/Aep9kAXYUDuWsaT85721JxeXFYkf4D/cgNd9+hxT8ZeDOJrn+ysqR7NO
2K9AdqTdIY2uZPKmvgHOkvH2gQD6jc05eSPOwdY/10IPvmpgUKaGOa/tyygL8Og4
3tYyoHipMMnS4OiYKakDJny0XVuchIP7ZMKiP07Q3FIuSS4omzR77kmc75/6Q9dP
v4wa90UCOn1j6r7WhMmX3eT3Gsdj3WMe9bYD0AFuqa6MDyjIeXq08mVGraXiw73s
Zale8OMckn/BU3O/3aFNLHLfET2H2hT6Wb3nwxjpLIfXmSVcVd8A58XH0g==
-----END CERTIFICATE-----

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

94
main.go
View File

@@ -1,32 +1,78 @@
package main
import (
"flag"
"path/filepath"
"runtime"
//go:generate go run gen.go $debug
. "github.com/Monibuca/engine/v2"
_ "github.com/Monibuca/plugin-cluster"
_ "github.com/Monibuca/plugin-gateway"
_ "github.com/Monibuca/plugin-hdl"
_ "github.com/Monibuca/plugin-hls"
_ "github.com/Monibuca/plugin-jessica"
_ "github.com/Monibuca/plugin-logrotate"
_ "github.com/Monibuca/plugin-record"
_ "github.com/Monibuca/plugin-rtmp"
_ "github.com/Monibuca/plugin-rtsp"
_ "github.com/Monibuca/plugin-ts"
/*
███ ███ ██████ ███ ██ 👑 ██████ ██ ██ ██████ █████
████ ████ ██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ████ ██ ██ ██ ██ ██ ██ ██ ██████ ██ ██ ██ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██████ ██ ████ ██ ██████ ██████ ██████ ██ ██
The live stream server for Go
(c) dexter 2019-present
说明:
本项目为 monibuca 的启动工程,你也可以自己创建一个启动工程
本启动工程引入了 engine 和一些列官方插件,并且保证版本依赖关系
自己创建工程的时候,版本依赖必须参考本工程,否则容易出现依赖关系错乱
流的播放地址请查看文档https://m7s.live/guide/qa/play.html
推拉流的配置方法看文档https://m7s.live/guide/config.html#%E6%8F%92%E4%BB%B6%E9%85%8D%E7%BD%AE
高频问题:
1、OBS只能推送 rtmp 协议,如需推送 rtsp 需要安装插件
2、除了rtsp协议以外其他协议播放H265需要使用jessibuca播放器preview 插件内置了jessibuca播放器
3、浏览器不能直接播放rtmp、rtsp等基于tcp的协议因为在js的环境中无法直接使用tcp或者udp传数据js没提供接口而rtsp或rtmp的流是基于tcp或者udp 所以纯web的方式目前是没办法直接播放rtsp或rtmp流的
4、webrtc是否可以播放h265取决于浏览器是否包含h265解码器通常不包含
5、webrtc不支持aac格式的音频
6、gb插件能收到设备的注册但是没有流可能1、媒体端口被防火墙拦截默认是582002、使用公网IP需要配置sipip字段或者mediaip字段用于设备向指定IP发送流。3、配置范围端口部分设备ssrc乱搞导致的
7、当没有订阅者的时候如何自动停止拉流设置publish 配置下的 delayclosetimeout 参数例如 10s代表最后一个订阅者离开后 10s 后自动停止流
8、使用 ffmpeg 推流时请加-c:v h264 -c:a aac否则 ffmpeg 会自动将流转换成系统不支持的格式
9、StreamPath 必须形如 live/test 。不能只有一级,或者斜杠开头,如/live 是错误的。
10、如果遇到直接退出崩溃查看一下fatal.log。
*/
import (
"context"
"flag"
"fmt"
"os"
"m7s.live/engine/v4"
"m7s.live/engine/v4/util"
_ "m7s.live/plugin/debug/v4"
_ "m7s.live/plugin/fmp4/v4"
_ "m7s.live/plugin/gb28181/v4"
_ "m7s.live/plugin/hdl/v4"
_ "m7s.live/plugin/hls/v4"
_ "m7s.live/plugin/hook/v4"
_ "m7s.live/plugin/jessica/v4"
_ "m7s.live/plugin/logrotate/v4"
_ "m7s.live/plugin/monitor/v4"
_ "m7s.live/plugin/preview/v4"
_ "m7s.live/plugin/record/v4"
_ "m7s.live/plugin/room/v4"
_ "m7s.live/plugin/rtmp/v4"
_ "m7s.live/plugin/rtsp/v4"
_ "m7s.live/plugin/snap/v4"
_ "m7s.live/plugin/webrtc/v4"
_ "m7s.live/plugin/webtransport/v4"
)
var (
version = "dev"
)
func main() {
addr := flag.String("c", "", "config file")
flag.Parse()
if *addr == "" {
_, currentFile, _, _ := runtime.Caller(0)
configFile := filepath.Join(filepath.Dir(currentFile), "config.toml")
Run(configFile)
} else {
Run(*addr)
fmt.Println("start github.com/langhuihui/monibuca version:", version)
confPathFromEnv := os.Getenv("M7S_CONFIG_FILE")
if confPathFromEnv == "" {
confPathFromEnv = "config.yaml" // 如果环境变量未设置,默认使用此路径
}
select {}
conf := flag.String("c", confPathFromEnv, "config file")
flag.Parse()
ctx, cancel := context.WithCancel(context.WithValue(context.Background(), "version", version))
go util.WaitTerm(cancel)
engine.Run(ctx, *conf)
}

BIN
monibuca_windows_amd64.syso Normal file

Binary file not shown.

View File

@@ -1 +0,0 @@
taskkill /pid 19960 -t -f

4
test/config.yaml Normal file
View File

@@ -0,0 +1,4 @@
global:
# loglevel: trace
publish:
ringsize: 20

52
test/stream_test.go Normal file
View File

@@ -0,0 +1,52 @@
package test
import (
"fmt"
"testing"
"time"
)
// TestPubAndSub 测试发布和订阅
func TestPubAndSub(t *testing.T) {
t.Cleanup(FreeEngine)
UseEngine()
t.Run("publish", func(t *testing.T) {
t.Parallel()
var pub UnitTestPublisher
unitTestPlugin.Publish("test/001", &pub)
})
t.Run("subscribe", func(t *testing.T) {
t.Parallel()
var sub UnitTestSubsciber
sub.tb = t
err := unitTestPlugin.Subscribe("test/001", &sub)
if err != nil {
t.Fatal(err)
} else {
sub.PlayRaw()
}
})
}
func BenchmarkPubAndSub(b *testing.B) {
b.Cleanup(FreeEngine)
UseEngine()
for i := 0; i < 10; i++ {
i := i
go func(i int) {
var pub UnitTestPublisher
unitTestPlugin.Publish(fmt.Sprintf("testb/%d", i), &pub)
}(i)
go b.RunParallel(func(pb *testing.PB) {
var sub UnitTestSubsciber
sub.tb = b
err := unitTestPlugin.Subscribe(fmt.Sprintf("testb/%d", i), &sub)
if err != nil {
// b.Fatal(err)
} else {
sub.PlayRaw()
}
})
}
time.Sleep(time.Second * 10)
}

33
test/subscriber_test.go Normal file
View File

@@ -0,0 +1,33 @@
package test
import (
"testing"
"time"
. "m7s.live/engine/v4"
)
type SlowSubsciber struct {
Subscriber
}
func (s *SlowSubsciber) OnEvent(event any) {
switch event.(type) {
case AudioFrame:
case VideoFrame:
// 模拟慢消费,导致长时间占用后被发布者移除
time.Sleep(1000 * time.Millisecond)
default:
s.Subscriber.OnEvent(event)
}
}
func TestSlowSubscriber(t *testing.T) {
t.Cleanup(FreeEngine)
UseEngine()
var pub UnitTestPublisher
unitTestPlugin.Publish("test/slow", &pub)
var suber SlowSubsciber
unitTestPlugin.Subscribe("test/slow", &suber)
suber.PlayRaw()
}

123
test/type.go Normal file
View File

@@ -0,0 +1,123 @@
package test
import (
"context"
"encoding/base64"
"sync"
"testing"
"time"
"go.uber.org/zap"
. "m7s.live/engine/v4"
"m7s.live/engine/v4/config"
"m7s.live/engine/v4/track"
"m7s.live/engine/v4/util"
)
var conf UnitTestConfig
var unitTestPlugin = InstallPlugin(&conf)
var spsppsbase64 = "AAABJ2QANKwTGqAoALWgHixLcAAAAAEozgVywA=="
var spspps, _ = base64.RawStdEncoding.DecodeString(spsppsbase64)
var EngineChan = make(chan int, 10)
var WaitEngine sync.WaitGroup
func UseEngine() {
EngineChan <- 1
WaitEngine.Wait()
}
func FreeEngine() {
EngineChan <- -1
}
func init() {
WaitEngine.Add(1)
go func() {
var use = 0
bg := context.Background()
var ctx context.Context
var cancel context.CancelFunc
for {
select {
case delta := <-EngineChan:
use += delta
switch use {
case 1:
ctx, cancel = context.WithTimeout(bg, time.Second*20)
go Run(ctx, "config.yaml")
case 0:
cancel()
WaitEngine.Add(1)
}
}
}
}()
}
type UnitTestConfig struct {
config.Subscribe
config.Publish
}
func (t *UnitTestConfig) OnEvent(event any) {
switch event.(type) {
case FirstConfig:
WaitEngine.Done()
}
}
type UnitTestPublisher struct {
tb testing.TB
Publisher
}
type UnitTestSubsciber struct {
tb testing.TB
Subscriber
}
func (s *UnitTestSubsciber) OnEvent(event any) {
switch v := event.(type) {
case AudioFrame:
case VideoFrame:
b := v.AUList.ToBytes()
seq := (uint16(b[1]) << 8) | uint16(b[2])
// s.Trace("sequence", zap.Uint32("sequence", v.Sequence), zap.Uint16("seq", seq), zap.Int("len", len(b)))
if v.Sequence != uint32(seq) {
s.tb.Fatal("sequence error", v.Sequence, seq)
}
default:
s.Subscriber.OnEvent(event)
}
}
func (pub *UnitTestPublisher) OnEvent(event any) {
switch event.(type) {
case IPublisher:
pub.VideoTrack = track.NewH264(pub)
pub.VideoTrack.WriteAnnexB(0, 0, spspps)
pub.AudioTrack = track.NewAAC(pub)
go pub.WriteAudio()
go pub.WriteVideo()
}
}
func (pub *UnitTestPublisher) WriteAudio() {
for i := uint32(0); pub.Err() == nil; i++ {
time.Sleep(40 * time.Millisecond)
elapse := time.Since(pub.StartTime)
pts := uint32(elapse.Milliseconds() * 90)
pub.AudioTrack.WriteADTS(pts, util.Buffer([]byte{0xFF, 0xE1, 0x20, 0x00, 0x29, 0xA7, 0xF0, byte(i >> 8), byte(i), 0}))
}
}
func (pub *UnitTestPublisher) WriteVideo() {
for i := uint32(0); pub.Err() == nil; i++ {
time.Sleep(40 * time.Millisecond)
elapse := time.Since(pub.StartTime)
pts := uint32(elapse.Milliseconds() * 90)
var naluType byte = 0x61
if elapse%8 == 0 {
naluType = 0x65
}
data := []byte{naluType, byte(i >> 8), byte(i)}
pub.Trace("data", zap.Uint32("i", i))
pub.VideoTrack.WriteNalu(pts, pts, data)
}
}