fix: PSReceiver block

This commit is contained in:
langhuihui
2025-11-06 19:59:18 +08:00
parent 78c9201552
commit bc6cad2529
4 changed files with 31 additions and 13 deletions

2
go.mod
View File

@@ -23,7 +23,7 @@ require (
github.com/icholy/digest v1.1.0
github.com/jinzhu/copier v0.4.0
github.com/kerberos-io/onvif v1.0.0
github.com/langhuihui/gotask v1.0.1
github.com/langhuihui/gotask v1.0.2
github.com/mark3labs/mcp-go v0.27.0
github.com/mattn/go-sqlite3 v1.14.24
github.com/mcuadros/go-defaults v1.2.0

4
go.sum
View File

@@ -160,8 +160,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/langhuihui/gomem v0.0.0-20251001011839-023923cf7683 h1:lITBgMb71ad6OUU9gycsheCw9PpMbXy3/QA8T0V0dVM=
github.com/langhuihui/gomem v0.0.0-20251001011839-023923cf7683/go.mod h1:BTPq1+4YUP4i7w8VHzs5AUIdn3T5gXjIUXbxgHW9TIQ=
github.com/langhuihui/gotask v1.0.1 h1:X+xETKZQ+OdRO8pNYudNdJH4yZ2QJM6ehHQVjw1i5RY=
github.com/langhuihui/gotask v1.0.1/go.mod h1:2zNqwV8M1pHoO0b5JC/A37oYpdtXrfL10Qof9AvR5IE=
github.com/langhuihui/gotask v1.0.2 h1:vcQ/9yD0+x2DkSrDBkYpufOyJxXs7i5fd7wUD8gvLLs=
github.com/langhuihui/gotask v1.0.2/go.mod h1:2zNqwV8M1pHoO0b5JC/A37oYpdtXrfL10Qof9AvR5IE=
github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo=
github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=

View File

@@ -89,6 +89,10 @@ func (p *PSReceiver) Start() error {
}
func (p *PSReceiver) Run() error {
err := p.Receiver.Run()
if err != nil {
return err
}
p.MpegPsDemuxer.Allocator = gomem.NewScalableMemoryAllocator(1 << gomem.MinPowerOf2)
p.Using(p.MpegPsDemuxer.Allocator)
return p.MpegPsDemuxer.Feed(p.BufReader)
@@ -97,7 +101,7 @@ func (p *PSReceiver) Run() error {
// UpdateRtpTimestamp 更新 RTP 时间戳(从 RTP 包中调用)
func (p *PSReceiver) UpdateRtpTimestamp(timestamp uint32) {
now := time.Now()
if !p.hasFirstTimestamp {
p.firstRtpTimestamp = timestamp
p.hasFirstTimestamp = true
@@ -108,12 +112,12 @@ func (p *PSReceiver) UpdateRtpTimestamp(timestamp uint32) {
p.ProgressUpdatePeriod = time.Second
}
}
// 检测时间戳是否变化
if timestamp != p.currentRtpTimestamp {
p.currentRtpTimestamp = timestamp
p.lastTimestampUpdate = now
// 定期触发进度更新回调(避免过于频繁)
if p.OnProgressUpdate != nil && now.Sub(p.lastProgressUpdate) >= p.ProgressUpdatePeriod {
p.lastProgressUpdate = now
@@ -184,7 +188,7 @@ func (p *Receiver) Start() (err error) {
return errors.New("start listen,err" + err.Error())
}
p.OnStop(p.Listener.Close)
conn, err = p.Accept()
return
} else {
conn = p.SinglePort
}
@@ -224,3 +228,17 @@ func (p *Receiver) Start() (err error) {
p.Using(rtpReader, p.BufReader)
return
}
func (p *Receiver) Run() error {
if p.Listener != nil {
conn, err := p.Accept()
if err != nil {
return err
}
p.OnStop(conn.Close)
rtpReader := NewRTPPayloadReader(NewRTPTCPReader(conn))
p.rtpReader = rtpReader
p.BufReader = util.NewBufReader(rtpReader)
}
return nil
}

View File

@@ -26,9 +26,9 @@ var (
defaultYaml m7s.DefaultYaml
reg_level = regexp.MustCompile("profile-level-id=(4.+f)")
_ = m7s.InstallPlugin[WebRTCPlugin](m7s.PluginMeta{
DefaultYaml: defaultYaml,
NewPuller: NewPuller,
NewPusher: NewPusher,
DefaultYaml: defaultYaml,
NewPuller: NewPuller,
NewPusher: NewPusher,
NewPullProxy: NewPullProxy,
})
)
@@ -37,9 +37,9 @@ type WebRTCPlugin struct {
m7s.Plugin
ICEServers []ICEServer `desc:"ice服务器配置"`
Port string `default:"tcp:9000" desc:"监听端口"`
PLI time.Duration `default:"2s" desc:"发送PLI请求间隔"` // 视频流丢包后发送PLI请求
EnableDC bool `default:"true" desc:"是否启用DataChannel"` // 在不支持编码格式的情况下是否启用DataChannel传输
MimeType []string `desc:"MimeType过滤列表为空则不过滤"` // MimeType过滤列表支持的格式如video/H264, audio/opus
PLI time.Duration `default:"2s" desc:"发送PLI请求间隔"` // 视频流丢包后发送PLI请求
EnableDC bool `desc:"是否启用DataChannel"` // 在不支持编码格式的情况下是否启用DataChannel传输
MimeType []string `desc:"MimeType过滤列表为空则不过滤"` // MimeType过滤列表支持的格式如video/H264, audio/opus
s SettingEngine
}