首页 文章 精选 留言 我的

精选列表

搜索[Go语言],共10000篇文章
优秀的个人博客,低调大师

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

发布摘要 新增av1和opus轨道类型 支持接受OBS 30.0+的WHIP(webrtc)推流,(h264+opus) 支持ffmpeg 6.1+以及OBS通过rtmp扩展协议的h265以及av1推拉流 修复若干bug 引擎和插件版本 engine v4.14.3 hls v4.3.7 hdl v4.1.10 rtsp v4.3.3 rtmp v4.2.9 webrtc v4.2.3 record v4.4.5 ps v4.1.4 详细说明 使用OBS的WHIP推流 OBS 30.0正式支持WHIP推流方式,因此需要先安装OBS 30.0以上版本。 OBS配置 注意事项 OBS目前只支持udp推流方式,因此需要配置webrtc插件为udp端口方式。 webrtc: port:udp:9000-10000 OBS目前音频轨道在WHIP中只能使用opus编码。由于rtmp协议不支持opus编码格式,因此在播放含有opus编码的流的时候,只能使用webrtc方式,或者rtsp协议。 使用OBS推送av1视频 OBS的av1格式可以通过rtmp扩展协议推送 OBS配置 经过测试如果关键帧间隔设置为0,会导致只有开头有关键帧,因此这里可以设置为1s。 ffmpeg推送h265/av1 ffmpeg 6.1以上支持rtmp扩展协议,下面是命令行示例(其中xxx代表视频源,即视频文件地址或者远程流地址) ffmpeg-ixxx-c:vh265-c:aaac-fflvrtmp://localhost/live/test ffmpeg-ixxx-c:vav1-c:aaac-fflvrtmp://localhost/live/test 播放av1视频 通过OBS、ffmpeg 6.1推送后,目前支持的播放方式: webrtc ffplay 6.1以上通过rtmp/rtsp协议播放

优秀的个人博客,低调大师

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

发布摘要 启动工程增加对流的发布订阅的单元测试和基准测试 修复发布和订阅并发创建流产生的panic 修复IdleTimeout无效问题 修复订阅者阻塞导致读写并发问题 preview插件修复https默认端口 gb28181插件PR合并 升级模块 升级后版本 engine 4.13.5 gb28181 4.3.6 hls 4.3.1 preview 4.1.2 record 4.3.7 详细说明 单元测试和基准测试 测试用例所在目录:github.com/langhuihui/monibuca工程下的test目录 推荐使用vscode打开工程,方便一键测试单个用例,也可以通过vscode侧边栏里的单元测试栏目管理。 TestPubAndSub funcTestPubAndSub(t*testing.T){ t.Cleanup(FreeEngine) UseEngine() t.Run("publish",func(t*testing.T){ t.Parallel() varpubUnitTestPublisher unitTestPlugin.Publish("test/001",&pub) }) t.Run("subscribe",func(t*testing.T){ t.Parallel() varsubUnitTestSubsciber sub.TB=t err:=unitTestPlugin.Subscribe("test/001",&sub) iferr!=nil{ t.Fatal(err) }else{ sub.PlayRaw() } }) } 该用例会启动一个发布者和一个订阅者,发布者将会写入假数据,订阅者读取后会校验数据是否正确。 BenchmarkPubAndSub funcBenchmarkPubAndSub(b*testing.B){ b.Cleanup(FreeEngine) UseEngine() fori:=0;i<10;i++{ i:=i gofunc(iint){ varpubUnitTestPublisher unitTestPlugin.Publish(fmt.Sprintf("testb/%d",i),&pub) }(i) gob.RunParallel(func(pb*testing.PB){ varsubUnitTestSubsciber sub.TB=b err:=unitTestPlugin.Subscribe(fmt.Sprintf("testb/%d",i),&sub) iferr!=nil{ //b.Fatal(err) }else{ sub.PlayRaw() } }) } time.Sleep(time.Second*10) } 该用例为基准测试,启动10个发布者,每个流会批量订阅,以测试并发性能以及稳定性。 TestSlowSubscriber funcTestSlowSubscriber(t*testing.T){ t.Cleanup(FreeEngine) UseEngine() varpubUnitTestPublisher unitTestPlugin.Publish("test/slow",&pub) varsuberSlowSubsciber unitTestPlugin.Subscribe("test/slow",&suber) suber.PlayRaw() } 这个用例会模拟一个订阅者被阻塞(sleep)后导致发布者写入的位置追上,此时engine通过标记这个写入点废弃来避免并发读写问题,废弃后订阅者如果被唤醒就会自动停止订阅。 通常出现这种情况是订阅者进行了某种耗时操作,比如写文件,或者网络阻塞等。 其他修复问题 并发创建流 修复如下: funcfindOrCreateStream(streamPathstring,waitTimeouttime.Duration)(s*Stream,createdbool){ p:=strings.Split(streamPath,"/") iflen(p)<2{ log.Warn(Red("StreamPathFormatError:"),streamPath) returnnil,false } actual,loaded:=Streams.LoadOrStore(streamPath,&Stream{ Path:streamPath, AppName:p[0], StreamName:strings.Join(p[1:],"/"), StartTime:time.Now(), +Logger:log.LocaleLogger.With(zap.String("stream",streamPath)), +timeout:time.NewTimer(waitTimeout), }) ifs:=actual.(*Stream);loaded{ s.Debug("StreamFound") returns,false }else{ -s.timeout=time.NewTimer(waitTimeout) s.Subscribers.Init() -s.Logger=log.LocaleLogger.With(zap.String("stream",streamPath)) -s.Info("created") s.actionChan.Init(1) +s.Info("created") gos.run() returns,true } } 原理:当并发调用findOrCreateStream函数时,前者尚未来得及对Logger赋值,后者就调用了s.Debug导致空指针错误。 修复读写并发问题 这个问题在前面的单元测试中已经提到,就是订阅者阻塞引起的。 订阅者阻塞后,读取点移动很慢或者不移动,导致写入点追上 由于RingBuffer是由链表结构实现,因此很容易将节点剥离主环 废弃后,这个订阅者将无法再读取主环内容,也将遭到抛弃 抛弃 https默认端口 默认https端口已经设置为8443,preview插件在选择WebTransport的时候跳转错了端口号。 https证书已经嵌入到程序里面,可以直接设置host文件127.0.0.1 local.monibuca.com访问https://local.monibuca.com:8443/preview/ gb28181 合并PR #95 本次PR主要修改了定时任务相关功能,包括: 定时删除超时设备 修改注册有效期配置默认值为3600s 设备状态变更处理 具体可以看代码变动

优秀的个人博客,低调大师

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

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

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册