mirror of
https://github.com/Monibuca/plugin-rtsp.git
synced 2025-09-27 03:56:08 +08:00
Compare commits
6 Commits
v4.3.1
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
![]() |
985f2d013b | ||
![]() |
5e722bf849 | ||
![]() |
6c1207ae43 | ||
![]() |
c794c0514f | ||
![]() |
e65f970097 | ||
![]() |
855038c132 |
13
go.mod
13
go.mod
@@ -3,11 +3,11 @@ module m7s.live/plugin/rtsp/v4
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/bluenviron/gortsplib/v4 v4.2.2-0.20231023175953-d4bb674a5091
|
||||
github.com/bluenviron/gortsplib/v4 v4.3.0
|
||||
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
|
||||
m7s.live/engine/v4 v4.14.3
|
||||
)
|
||||
|
||||
require (
|
||||
@@ -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.1 // indirect
|
||||
github.com/google/uuid v1.4.0 // 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
|
||||
@@ -26,6 +26,7 @@ require (
|
||||
github.com/pion/rtcp v1.2.10 // indirect
|
||||
github.com/pion/sdp/v3 v3.0.6 // indirect
|
||||
github.com/pion/webrtc/v3 v3.2.14 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
|
||||
github.com/q191201771/naza v0.30.11 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.3.1 // indirect
|
||||
@@ -38,12 +39,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.14.0 // indirect
|
||||
golang.org/x/crypto v0.17.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.17.0 // indirect
|
||||
golang.org/x/sync v0.2.0 // indirect
|
||||
golang.org/x/sys v0.13.0 // indirect
|
||||
golang.org/x/sys v0.15.0 // indirect
|
||||
golang.org/x/tools v0.9.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
)
|
||||
|
23
go.sum
23
go.sum
@@ -1,7 +1,7 @@
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
|
||||
github.com/bluenviron/gortsplib/v4 v4.2.2-0.20231023175953-d4bb674a5091 h1:VY+xh0y9kIrAqwuJHUOdS/ZdY2JPtNqzWtVN4QJr2Lo=
|
||||
github.com/bluenviron/gortsplib/v4 v4.2.2-0.20231023175953-d4bb674a5091/go.mod h1:VOoeI2VxRKh5eEg6Y48DGb/oLxU1i+X0Xzv9z8dvsUQ=
|
||||
github.com/bluenviron/gortsplib/v4 v4.3.0 h1:wYtXickYP9zkCxbBIt2WEseQPX0wROB+K0DAew4Ls7g=
|
||||
github.com/bluenviron/gortsplib/v4 v4.3.0/go.mod h1:4XBcXsbK4MDFqnraexSDeKj++ZzrSd81CVplSpSNqKk=
|
||||
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=
|
||||
@@ -51,8 +51,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
|
||||
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/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/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
|
||||
github.com/google/uuid v1.4.0/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=
|
||||
@@ -117,6 +117,7 @@ github.com/pion/webrtc/v3 v3.2.14 h1:GlqnBnnLlcYYA/LOwqLLU1plZYwx0Y/e/57bZ2tzQcU
|
||||
github.com/pion/webrtc/v3 v3.2.14/go.mod h1:r1mtixc2MH847mmQTPwlEvGge7D18C2T5qp8jI9Lm44=
|
||||
github.com/pixelbender/go-sdp v1.1.0/go.mod h1:6IBlz9+BrUHoFTea7gcp4S54khtOhjCW/nVDLhmZBAs=
|
||||
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=
|
||||
@@ -174,8 +175,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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
|
||||
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
|
||||
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=
|
||||
@@ -240,8 +241,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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
|
||||
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
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=
|
||||
@@ -264,7 +265,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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
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=
|
||||
@@ -301,5 +302,5 @@ 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=
|
||||
m7s.live/engine/v4 v4.13.12 h1:GYdIPlvwkS57DbZGvQxgMJIKL+hyYZpOv/8qNjGbY6E=
|
||||
m7s.live/engine/v4 v4.13.12/go.mod h1:cRR/WOZbPSAQfYxIHuCkj1YMg+C54CYlFpOJ88q+OG4=
|
||||
m7s.live/engine/v4 v4.14.3 h1:yTUm40lQ+wI7/IkO2UvPZAbKAS5ovmbdm2DPe+twhl4=
|
||||
m7s.live/engine/v4 v4.14.3/go.mod h1:cRR/WOZbPSAQfYxIHuCkj1YMg+C54CYlFpOJ88q+OG4=
|
||||
|
10
main.go
10
main.go
@@ -17,11 +17,11 @@ type RTSPConfig struct {
|
||||
config.Subscribe
|
||||
config.Pull
|
||||
config.Push
|
||||
ListenAddr string `default:":554"`
|
||||
UDPAddr string `default:":8000"`
|
||||
RTCPAddr string `default:":8001"`
|
||||
WriteBufferCount int `default:"2048"`
|
||||
SendOptions bool `default:"true"`
|
||||
ListenAddr string `default:":554" desc:"rtsp监听地址"`
|
||||
UDPAddr string `default:":8000" desc:"udp rtp监听地址"`
|
||||
RTCPAddr string `default:":8001" desc:"udp rtcp监听地址"`
|
||||
WriteBufferCount int `default:"2048" desc:"rtsp写缓冲区大小"`
|
||||
SendOptions bool `default:"true" desc:"是否发送options请求"`
|
||||
sync.Map
|
||||
server *gortsplib.Server
|
||||
}
|
||||
|
13
publisher.go
13
publisher.go
@@ -57,7 +57,14 @@ func (p *RTSPPublisher) SetTracks() error {
|
||||
}
|
||||
if len(f.PPS) > 0 {
|
||||
vt.WriteSliceBytes(f.PPS)
|
||||
}
|
||||
case *format.AV1:
|
||||
vt := p.VideoTrack
|
||||
if vt == nil {
|
||||
vt = NewAV1(p.Stream, f.PayloadType())
|
||||
p.VideoTrack = vt
|
||||
}
|
||||
p.Tracks[track] = p.VideoTrack
|
||||
case *format.MPEG4Audio:
|
||||
at := p.AudioTrack
|
||||
if at == nil {
|
||||
@@ -82,6 +89,12 @@ func (p *RTSPPublisher) SetTracks() error {
|
||||
p.AudioTrack = at
|
||||
}
|
||||
p.Tracks[track] = p.AudioTrack
|
||||
case *format.Opus:
|
||||
at := p.AudioTrack
|
||||
if at == nil {
|
||||
at := NewOpus(p.Stream, f.PayloadType(), uint32(f.ClockRate()))
|
||||
p.AudioTrack = at
|
||||
}
|
||||
default:
|
||||
rtpMap := strings.ToLower(forma.RTPMap())
|
||||
if strings.Contains(rtpMap, "pcm") {
|
||||
|
@@ -1,6 +1,8 @@
|
||||
package rtsp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/bluenviron/gortsplib/v4"
|
||||
"github.com/bluenviron/gortsplib/v4/pkg/description"
|
||||
"github.com/bluenviron/gortsplib/v4/pkg/format"
|
||||
@@ -23,7 +25,7 @@ func (s *RTSPSubscriber) OnEvent(event any) {
|
||||
}
|
||||
switch v.CodecID {
|
||||
case codec.CodecID_H264:
|
||||
video := &description.Media{
|
||||
s.videoTrack = &description.Media{
|
||||
Type: description.MediaTypeVideo,
|
||||
Formats: []format.Format{&format.H264{
|
||||
PacketizationMode: 1,
|
||||
@@ -32,10 +34,8 @@ func (s *RTSPSubscriber) OnEvent(event any) {
|
||||
PPS: v.ParamaterSets[1],
|
||||
}},
|
||||
}
|
||||
s.videoTrack = video
|
||||
s.tracks = append(s.tracks, video)
|
||||
case codec.CodecID_H265:
|
||||
video := &description.Media{
|
||||
s.videoTrack = &description.Media{
|
||||
Type: description.MediaTypeVideo,
|
||||
Formats: []format.Format{&format.H265{
|
||||
PayloadTyp: v.PayloadType,
|
||||
@@ -44,17 +44,32 @@ func (s *RTSPSubscriber) OnEvent(event any) {
|
||||
PPS: v.ParamaterSets[2],
|
||||
}},
|
||||
}
|
||||
s.videoTrack = video
|
||||
s.tracks = append(s.tracks, video)
|
||||
case codec.CodecID_AV1:
|
||||
var idx, profile, tail int
|
||||
idx = int(v.ParamaterSets[1][0])
|
||||
profile = int(v.ParamaterSets[1][1])
|
||||
tail = int(v.ParamaterSets[1][2])
|
||||
s.videoTrack = &description.Media{
|
||||
Type: description.MediaTypeVideo,
|
||||
Formats: []format.Format{&format.AV1{
|
||||
PayloadTyp: v.PayloadType,
|
||||
LevelIdx: &idx,
|
||||
Profile: &profile,
|
||||
Tier: &tail,
|
||||
}},
|
||||
}
|
||||
}
|
||||
if s.videoTrack != nil {
|
||||
s.tracks = append(s.tracks, s.videoTrack)
|
||||
s.AddTrack(v)
|
||||
}
|
||||
s.AddTrack(v)
|
||||
case *track.Audio:
|
||||
if s.Audio != nil {
|
||||
return
|
||||
}
|
||||
switch v.CodecID {
|
||||
case codec.CodecID_AAC:
|
||||
audio := &description.Media{
|
||||
s.audioTrack = &description.Media{
|
||||
Type: description.MediaTypeAudio,
|
||||
Formats: []format.Format{&format.MPEG4Audio{
|
||||
PayloadTyp: v.PayloadType,
|
||||
@@ -68,29 +83,39 @@ func (s *RTSPSubscriber) OnEvent(event any) {
|
||||
IndexDeltaLength: v.IndexDeltaLength,
|
||||
}},
|
||||
}
|
||||
s.audioTrack = audio
|
||||
s.tracks = append(s.tracks, audio)
|
||||
case codec.CodecID_PCMA:
|
||||
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 := &description.Media{
|
||||
s.audioTrack = &description.Media{
|
||||
Type: description.MediaTypeAudio,
|
||||
Formats: []format.Format{&format.G711{
|
||||
MULaw: true,
|
||||
Formats: []format.Format{&format.Generic{
|
||||
PayloadTyp: v.PayloadType,
|
||||
ClockRat: int(v.SampleRate),
|
||||
RTPMa: fmt.Sprintf("PCMA/%d", v.SampleRate),
|
||||
}},
|
||||
}
|
||||
case codec.CodecID_PCMU:
|
||||
s.audioTrack = &description.Media{
|
||||
Type: description.MediaTypeAudio,
|
||||
Formats: []format.Format{&format.Generic{
|
||||
PayloadTyp: v.PayloadType,
|
||||
ClockRat: int(v.SampleRate),
|
||||
RTPMa: fmt.Sprintf("PCMU/%d", v.SampleRate),
|
||||
}},
|
||||
}
|
||||
case codec.CodecID_OPUS:
|
||||
s.audioTrack = &description.Media{
|
||||
Type: description.MediaTypeAudio,
|
||||
Formats: []format.Format{&format.Opus{
|
||||
PayloadTyp: v.PayloadType,
|
||||
}},
|
||||
}
|
||||
s.audioTrack = audio
|
||||
s.tracks = append(s.tracks, audio)
|
||||
}
|
||||
s.AddTrack(v)
|
||||
if s.audioTrack != nil {
|
||||
s.tracks = append(s.tracks, s.audioTrack)
|
||||
s.AddTrack(v)
|
||||
}
|
||||
case ISubscriber:
|
||||
s.session = &description.Session{
|
||||
Medias: s.tracks,
|
||||
Medias: s.tracks,
|
||||
}
|
||||
if s.server != nil {
|
||||
s.stream = gortsplib.NewServerStream(s.server, s.session)
|
||||
|
Reference in New Issue
Block a user