refactor: 解析音视频帧不再单独占用一个协程,直接在网络收流协程完成;

This commit is contained in:
ydajiang
2025-06-07 17:32:59 +08:00
parent fd718ffec2
commit 3553a1b582
17 changed files with 206 additions and 269 deletions

View File

@@ -197,100 +197,6 @@ func StartIdleTimer(source Source) *time.Timer {
// LoopEvent 循环读取事件
func LoopEvent(source Source) {
// 将超时计时器放在此处开启, 方便在退出的时候关闭
var receiveTimer *time.Timer
var idleTimer *time.Timer
var probeTimer *time.Timer
defer func() {
log.Sugar.Debugf("主协程执行结束 source: %s", source.GetID())
// 关闭计时器
if receiveTimer != nil {
receiveTimer.Stop()
}
if idleTimer != nil {
idleTimer.Stop()
}
if probeTimer != nil {
probeTimer.Stop()
}
// 未使用的数据, 放回池中
for len(source.StreamPipe()) > 0 {
data := <-source.StreamPipe()
if size := cap(data); size > UDPReceiveBufferSize {
TCPReceiveBufferPool.Put(data[:size])
} else {
UDPReceiveBufferPool.Put(data[:size])
}
}
}()
// 开启收流超时计时器
if AppConfig.ReceiveTimeout > 0 {
receiveTimer = StartReceiveDataTimer(source)
}
// 开启拉流空闲超时计时器
if AppConfig.Hooks.IsEnableOnIdleTimeout() && AppConfig.IdleTimeout > 0 {
idleTimer = StartIdleTimer(source)
}
// 开启探测超时计时器
probeTimer = time.AfterFunc(time.Duration(AppConfig.ProbeTimeout)*time.Millisecond, func() {
if source.IsCompleted() {
return
}
var ok bool
source.executeSyncEvent(func() {
source.ProbeTimeout()
ok = len(source.OriginTracks()) > 0
})
if !ok {
source.Close()
return
}
})
// 启动协程, 生成发布传输流
source.StartTimers(source)
go source.GetTransStreamPublisher().run()
for {
select {
// 读取推流数据
case data := <-source.StreamPipe():
if AppConfig.ReceiveTimeout > 0 {
source.SetLastPacketTime(time.Now())
}
if err := source.Input(data); err != nil {
log.Sugar.Errorf("解析推流数据发生err: %s 释放source: %s", err.Error(), source.GetID())
go source.Close()
return
}
// 使用后, 放回池中
if size := cap(data); size > UDPReceiveBufferSize {
TCPReceiveBufferPool.Put(data[:size])
} else {
UDPReceiveBufferPool.Put(data[:size])
}
break
// 切换到主协程,执行该函数. 目的是用于无锁化处理推拉流的连接与断开, 推流源断开, 查询推流源信息等事件. 不要做耗时操作, 否则会影响推拉流.
case event := <-source.MainContextEvents():
event()
if source.IsClosed() {
// 处理推流管道剩余的数据?
return
}
break
}
}
}