diff --git a/client.go b/client.go index 01d2750..7ecea1c 100644 --- a/client.go +++ b/client.go @@ -4,9 +4,9 @@ import ( "context" "net" - "github.com/bluenviron/gortsplib/v3" - "github.com/bluenviron/gortsplib/v3/pkg/base" - "github.com/bluenviron/gortsplib/v3/pkg/url" + "github.com/bluenviron/gortsplib/v4" + "github.com/bluenviron/gortsplib/v4/pkg/base" + "github.com/bluenviron/gortsplib/v4/pkg/url" "go.uber.org/zap" "m7s.live/engine/v4" ) @@ -30,9 +30,9 @@ func (p *RTSPClient) Disconnect() { func (p *RTSPPuller) Connect() error { client := &gortsplib.Client{ - DialContext: p.DialContext, - ReadBufferCount: rtspConfig.ReadBufferCount, - AnyPortEnable: true, + DialContext: p.DialContext, + + AnyPortEnable: true, } p.Transport = gortsplib.TransportTCP client.Transport = &p.Transport @@ -59,19 +59,19 @@ func (p *RTSPPuller) Pull() (err error) { } p.Debug("Options", zap.Any("res", res)) // find published tracks - tracks, baseURL, res, err := p.Describe(u) + session, res, err := p.Describe(u) if err != nil { p.Error("Describe", zap.Error(err)) return err } p.Debug("Describe", zap.Any("res", res)) - p.tracks = tracks + p.session = session err = p.SetTracks() if err != nil { p.Error("SetTracks", zap.Error(err)) return err } - if err = p.SetupAll(tracks, baseURL); err != nil { + if err = p.SetupAll(session.BaseURL, session.Medias); err != nil { p.Error("SetupAndPlay", zap.Error(err)) return err } @@ -104,8 +104,8 @@ func (p *RTSPPusher) OnEvent(event any) { func (p *RTSPPusher) Connect() error { p.Client = &gortsplib.Client{ - DialContext: p.DialContext, - WriteBufferCount: rtspConfig.WriteBufferCount, + DialContext: p.DialContext, + WriteQueueSize: rtspConfig.WriteBufferCount, } // parse URL u, err := url.Parse(p.RemoteURL) @@ -131,11 +131,11 @@ func (p *RTSPPusher) Push() (err error) { // return fmt.Errorf("timeout") // } // } - if _, err = p.Announce(u, p.tracks); err != nil { + if _, err = p.Announce(u, p.session); err != nil { p.Error("Announce", zap.Error(err)) return } - err = p.SetupAll(p.tracks, u) + err = p.SetupAll(p.session.BaseURL, p.session.Medias) if err != nil { p.Error("Setup", zap.Error(err)) return diff --git a/go.mod b/go.mod index d551c3a..73c2466 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,9 @@ module m7s.live/plugin/rtsp/v4 go 1.18 require ( - github.com/bluenviron/gortsplib/v3 v3.10.0 - github.com/bluenviron/mediacommon v1.0.0 - github.com/pion/rtp v1.8.1 + github.com/bluenviron/gortsplib/v4 v4.2.1 + github.com/bluenviron/mediacommon v1.5.0 + github.com/pion/rtp v1.8.2 go.uber.org/zap v1.24.0 m7s.live/engine/v4 v4.13.12 ) @@ -17,7 +17,7 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/golang/mock v1.6.0 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.3.1 // indirect github.com/logrusorgru/aurora/v4 v4.0.0 // indirect github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect github.com/mcuadros/go-defaults v1.2.0 // indirect @@ -38,12 +38,12 @@ require ( github.com/yusufpapurcu/wmi v1.2.3 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.12.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.14.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.13.0 // indirect golang.org/x/tools v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect -) +) \ No newline at end of file diff --git a/go.sum b/go.sum index 032879e..df5159d 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,11 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= -github.com/bluenviron/gortsplib/v3 v3.10.0 h1:E2ytPD1/b6JgzHYVSsyaG2xtXsvaGw9sxTdZ0Wnwsd4= -github.com/bluenviron/gortsplib/v3 v3.10.0/go.mod h1:prNU1aMVBmgmmKwlvLiEdjBbTEpTw4BRsqVcqEARgMY= -github.com/bluenviron/mediacommon v1.0.0 h1:hKelTQKfetasCmXaXMiL1ihID0GRmItyWZt1/pqiKKk= -github.com/bluenviron/mediacommon v1.0.0/go.mod h1:nt5oKCO0WcZ+AH1oc12gs2ldp67xW2vl88c2StNmPlI= +github.com/bluenviron/gortsplib/v4 v3.11.0 h1:oE8j9/2+T2JyttEO9SkJKskRerdMaW10zPoI0vEIlz4= +github.com/bluenviron/gortsplib/v4 v3.11.0/go.mod h1:LZewC0KP6zhBceENKiSMNEryqGHljoIMq5W1SVS4vNs= +github.com/bluenviron/gortsplib/v4 v4.2.1 h1:LugQr3TIKoj6GjOf470teDP8goWiL8PTrX2OaF+L2Vc= +github.com/bluenviron/gortsplib/v4 v4.2.1/go.mod h1:VOoeI2VxRKh5eEg6Y48DGb/oLxU1i+X0Xzv9z8dvsUQ= +github.com/bluenviron/mediacommon v1.5.0 h1:lS0YKNo22ZOyCsYcLh3jn3TgUALqYw0f7RVwalC09vI= +github.com/bluenviron/mediacommon v1.5.0/go.mod h1:Ij/kE1LEucSjryNBVTyPL/gBI0d6/Css3f5PyrM957w= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -50,8 +52,9 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -98,8 +101,8 @@ github.com/pion/rtcp v1.2.10/go.mod h1:ztfEwXZNLGyF1oQDttz/ZKIBaeeg/oWbRYqzBM9TL github.com/pion/rtp v1.6.2/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.7.13/go.mod h1:bDb5n+BFZxXx0Ea7E5qe+klMuqiBrP+w8XSjiWtCUko= github.com/pion/rtp v1.8.0/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= -github.com/pion/rtp v1.8.1 h1:26OxTc6lKg/qLSGir5agLyj0QKaOv8OP5wps2SFnVNQ= -github.com/pion/rtp v1.8.1/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= +github.com/pion/rtp v1.8.2 h1:oKMM0K1/QYQ5b5qH+ikqDSZRipP5mIxPJcgcvw5sH0w= +github.com/pion/rtp v1.8.2/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.7/go.mod h1:g1Ul+ARqZq5JEmoFy87Q/4CePtKnTJ1QCL9dBBdN6AU= github.com/pion/sdp/v3 v3.0.6 h1:WuDLhtuFUUVpTfus9ILC4HRyHsW6TdugjEX/QY9OiUw= @@ -173,8 +176,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o= golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -200,8 +203,8 @@ 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.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -239,8 +242,8 @@ 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 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= 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= @@ -263,7 +266,7 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= 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= diff --git a/main.go b/main.go index 7545398..b007ce7 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,7 @@ import ( "strconv" "sync" - "github.com/bluenviron/gortsplib/v3" + "github.com/bluenviron/gortsplib/v4" "go.uber.org/zap" . "m7s.live/engine/v4" "m7s.live/engine/v4/config" @@ -20,15 +20,15 @@ type RTSPConfig struct { ListenAddr string `default:":554"` UDPAddr string `default:":8000"` RTCPAddr string `default:":8001"` - ReadBufferCount int `default:"2048"` WriteBufferCount int `default:"2048"` sync.Map + server *gortsplib.Server } func (conf *RTSPConfig) OnEvent(event any) { switch v := event.(type) { case FirstConfig: - s := &gortsplib.Server{ + conf.server = &gortsplib.Server{ Handler: conf, RTSPAddress: conf.ListenAddr, UDPRTPAddress: conf.UDPAddr, @@ -36,10 +36,9 @@ func (conf *RTSPConfig) OnEvent(event any) { MulticastIPRange: "224.1.0.0/16", MulticastRTPPort: 8002, MulticastRTCPPort: 8003, - ReadBufferCount: conf.ReadBufferCount, - WriteBufferCount: conf.WriteBufferCount, + WriteQueueSize: conf.WriteBufferCount, } - if err := s.Start(); err != nil { + if err := conf.server.Start(); err != nil { RTSPPlugin.Error("server start", zap.Error(err)) RTSPPlugin.Disabled = true } @@ -55,9 +54,9 @@ func (conf *RTSPConfig) OnEvent(event any) { } } case InvitePublish: //按需拉流 - if url, ok := conf.PullOnSub[v.Target]; ok { - if err := RTSPPlugin.Pull(v.Target, url, new(RTSPPuller), 0); err != nil { - RTSPPlugin.Error("pull", zap.String("streamPath", v.Target), zap.String("url", url), zap.Error(err)) + if remoteURL := conf.CheckPullOnSub(v.Target); remoteURL != "" { + if err := RTSPPlugin.Pull(v.Target, remoteURL, new(RTSPPuller), 0); err != nil { + RTSPPlugin.Error("pull", zap.String("streamPath", v.Target), zap.String("url", remoteURL), zap.Error(err)) } } } diff --git a/publisher.go b/publisher.go index 97f10ee..646c928 100644 --- a/publisher.go +++ b/publisher.go @@ -3,8 +3,8 @@ package rtsp import ( "strings" - "github.com/bluenviron/gortsplib/v3/pkg/formats" - "github.com/bluenviron/gortsplib/v3/pkg/media" + "github.com/bluenviron/gortsplib/v4/pkg/description" + "github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/mediacommon/pkg/codecs/mpeg4audio" "github.com/pion/rtp" "go.uber.org/zap" @@ -15,21 +15,21 @@ import ( type RTSPPublisher struct { Publisher - Tracks map[*media.Media]common.AVTrack `json:"-" yaml:"-"` + Tracks map[*description.Media]common.AVTrack `json:"-" yaml:"-"` RTSPIO } func (p *RTSPPublisher) SetTracks() error { - p.Tracks = make(map[*media.Media]common.AVTrack, len(p.tracks)) + p.Tracks = make(map[*description.Media]common.AVTrack, len(p.session.Medias)) defer func() { for _, track := range p.Tracks { p.Info("set track", zap.String("name", track.GetName())) } }() - for _, track := range p.tracks { + for _, track := range p.session.Medias { for _, forma := range track.Formats { switch f := forma.(type) { - case *formats.H264: + case *format.H264: vt := p.VideoTrack if vt == nil { vt = NewH264(p.Stream, f.PayloadType()) @@ -42,7 +42,7 @@ func (p *RTSPPublisher) SetTracks() error { if len(f.PPS) > 0 { vt.WriteSliceBytes(f.PPS) } - case *formats.H265: + case *format.H265: vt := p.VideoTrack if vt == nil { vt = NewH265(p.Stream, f.PayloadType()) @@ -58,7 +58,7 @@ func (p *RTSPPublisher) SetTracks() error { if len(f.PPS) > 0 { vt.WriteSliceBytes(f.PPS) } - case *formats.MPEG4Audio: + case *format.MPEG4Audio: at := p.AudioTrack if at == nil { at := NewAAC(p.Stream, f.PayloadType(), uint32(f.Config.SampleRate)) @@ -75,7 +75,7 @@ func (p *RTSPPublisher) SetTracks() error { p.AudioTrack = at } p.Tracks[track] = p.AudioTrack - case *formats.G711: + case *format.G711: at := p.AudioTrack if at == nil { at := NewG711(p.Stream, !f.MULaw, f.PayloadType(), uint32(f.ClockRate())) @@ -96,7 +96,7 @@ func (p *RTSPPublisher) SetTracks() error { } p.Tracks[track] = p.AudioTrack } else { - p.Warn("unknown format", zap.Any("format", f.String())) + p.Warn("unknown format", zap.Any("format", f.FMTP())) } } } @@ -112,7 +112,7 @@ func (p *RTSPPublisher) SetTracks() error { return nil } -func (p *RTSPPublisher) OnPacket(m *media.Media, f formats.Format, pack *rtp.Packet) { +func (p *RTSPPublisher) OnPacket(m *description.Media, f format.Format, pack *rtp.Packet) { if t, ok := p.Tracks[m]; ok { t.WriteRTPPack(pack) } diff --git a/server.go b/server.go index 7f59280..fed94fa 100644 --- a/server.go +++ b/server.go @@ -1,18 +1,20 @@ package rtsp import ( - "github.com/bluenviron/gortsplib/v3" - "github.com/bluenviron/gortsplib/v3/pkg/base" - "github.com/bluenviron/gortsplib/v3/pkg/media" + "github.com/bluenviron/gortsplib/v4" + "github.com/bluenviron/gortsplib/v4/pkg/base" + "github.com/bluenviron/gortsplib/v4/pkg/description" "go.uber.org/zap" . "m7s.live/engine/v4" ) type RTSPIO struct { - tracks media.Medias + server *gortsplib.Server + session *description.Session + tracks []*description.Media stream *gortsplib.ServerStream - audioTrack *media.Media - videoTrack *media.Media + audioTrack *description.Media + videoTrack *description.Media } func (conf *RTSPConfig) OnConnOpen(ctx *gortsplib.ServerHandlerOnConnOpenCtx) { @@ -39,6 +41,7 @@ func (conf *RTSPConfig) OnSessionClose(ctx *gortsplib.ServerHandlerOnSessionClos func (conf *RTSPConfig) OnDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx) (*base.Response, *gortsplib.ServerStream, error) { RTSPPlugin.Debug("describe request") var suber RTSPSubscriber + suber.server = conf.server suber.RemoteAddr = ctx.Conn.NetConn().RemoteAddr().String() suber.SetIO(ctx.Conn.NetConn()) streamPath := ctx.Path @@ -100,8 +103,8 @@ func (conf *RTSPConfig) OnAnnounce(ctx *gortsplib.ServerHandlerOnAnnounceCtx) (* p := &RTSPPublisher{} p.SetIO(ctx.Conn.NetConn()) if err := RTSPPlugin.Publish(ctx.Path, p); err == nil { - p.tracks = ctx.Medias - p.stream = gortsplib.NewServerStream(ctx.Medias) + p.session = ctx.Description + p.stream = gortsplib.NewServerStream(conf.server, ctx.Description) if err = p.SetTracks(); err != nil { return nil, err } diff --git a/subscriber.go b/subscriber.go index cad13fb..1dc73d1 100644 --- a/subscriber.go +++ b/subscriber.go @@ -1,10 +1,10 @@ package rtsp import ( - "github.com/bluenviron/gortsplib/v3" + "github.com/bluenviron/gortsplib/v4" + "github.com/bluenviron/gortsplib/v4/pkg/description" + "github.com/bluenviron/gortsplib/v4/pkg/format" "github.com/bluenviron/mediacommon/pkg/codecs/mpeg4audio" - "github.com/bluenviron/gortsplib/v3/pkg/formats" - "github.com/bluenviron/gortsplib/v3/pkg/media" . "m7s.live/engine/v4" "m7s.live/engine/v4/codec" "m7s.live/engine/v4/track" @@ -23,9 +23,9 @@ func (s *RTSPSubscriber) OnEvent(event any) { } switch v.CodecID { case codec.CodecID_H264: - video := &media.Media{ - Type: media.TypeVideo, - Formats: []formats.Format{&formats.H264{ + video := &description.Media{ + Type: description.MediaTypeVideo, + Formats: []format.Format{&format.H264{ PacketizationMode: 1, PayloadTyp: v.PayloadType, SPS: v.ParamaterSets[0], @@ -35,9 +35,9 @@ func (s *RTSPSubscriber) OnEvent(event any) { s.videoTrack = video s.tracks = append(s.tracks, video) case codec.CodecID_H265: - video := &media.Media{ - Type: media.TypeVideo, - Formats: []formats.Format{&formats.H265{ + video := &description.Media{ + Type: description.MediaTypeVideo, + Formats: []format.Format{&format.H265{ PayloadTyp: v.PayloadType, VPS: v.ParamaterSets[0], SPS: v.ParamaterSets[1], @@ -54,9 +54,9 @@ func (s *RTSPSubscriber) OnEvent(event any) { } switch v.CodecID { case codec.CodecID_AAC: - audio := &media.Media{ - Type: media.TypeAudio, - Formats: []formats.Format{&formats.MPEG4Audio{ + audio := &description.Media{ + Type: description.MediaTypeAudio, + Formats: []format.Format{&format.MPEG4Audio{ PayloadTyp: v.PayloadType, Config: &mpeg4audio.Config{ Type: mpeg4audio.ObjectTypeAACLC, @@ -71,16 +71,16 @@ func (s *RTSPSubscriber) OnEvent(event any) { s.audioTrack = audio s.tracks = append(s.tracks, audio) case codec.CodecID_PCMA: - audio := &media.Media{ - Type: media.TypeAudio, - Formats: []formats.Format{&formats.G711{}}, + audio := &description.Media{ + Type: description.MediaTypeAudio, + Formats: []format.Format{&format.G711{}}, } s.audioTrack = audio s.tracks = append(s.tracks, audio) case codec.CodecID_PCMU: - audio := &media.Media{ - Type: media.TypeAudio, - Formats: []formats.Format{&formats.G711{ + audio := &description.Media{ + Type: description.MediaTypeAudio, + Formats: []format.Format{&format.G711{ MULaw: true, }}, } @@ -89,7 +89,12 @@ func (s *RTSPSubscriber) OnEvent(event any) { } s.AddTrack(v) case ISubscriber: - s.stream = gortsplib.NewServerStream(s.tracks) + s.session = &description.Session{ + Medias: s.tracks, + } + if s.server != nil { + s.stream = gortsplib.NewServerStream(s.server, s.session) + } case VideoRTP: s.stream.WritePacketRTP(s.videoTrack, v.Packet) case AudioRTP: