mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-25 12:32:01 -08:00
RTSP server: support setupping tracks with arbitrary interleaved IDs (#402)
This commit is contained in:
parent
c900bc44c0
commit
a6d9578d4c
6 changed files with 35 additions and 25 deletions
2
go.mod
2
go.mod
|
|
@ -5,7 +5,7 @@ go 1.16
|
|||
require (
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
||||
github.com/aler9/gortsplib v0.0.0-20210622205248-a58563453211
|
||||
github.com/aler9/gortsplib v0.0.0-20210626112538-649c63cf5b62
|
||||
github.com/asticode/go-astits v0.0.0-00010101000000-000000000000
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/fsnotify/fsnotify v1.4.9
|
||||
|
|
|
|||
4
go.sum
4
go.sum
|
|
@ -4,8 +4,8 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2c
|
|||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/aler9/go-astits v0.0.0-20210423195926-582b09ed7c04 h1:CXgQLsU4uxWAmsXNOjGLbj0A+0IlRcpZpMgI13fmVwo=
|
||||
github.com/aler9/go-astits v0.0.0-20210423195926-582b09ed7c04/go.mod h1:DkOWmBNQpnr9mv24KfZjq4JawCFX1FCqjLVGvO0DygQ=
|
||||
github.com/aler9/gortsplib v0.0.0-20210622205248-a58563453211 h1:x/0AMdA9hsiNsA+FwqgZwzHPhl42T66naVS4toiLg5E=
|
||||
github.com/aler9/gortsplib v0.0.0-20210622205248-a58563453211/go.mod h1:s5FsbPRxJhU/YedvUKAKHVY+lQEdYsiJpuN2CHb89cI=
|
||||
github.com/aler9/gortsplib v0.0.0-20210626112538-649c63cf5b62 h1:PPTqxgdDmDBQcDziEuLqS4VzmMTp5NSd7b3WZqQCtR4=
|
||||
github.com/aler9/gortsplib v0.0.0-20210626112538-649c63cf5b62/go.mod h1:s5FsbPRxJhU/YedvUKAKHVY+lQEdYsiJpuN2CHb89cI=
|
||||
github.com/aler9/rtmp v0.0.0-20210403095203-3be4a5535927 h1:95mXJ5fUCYpBRdSOnLAQAdJHHKxxxJrVCiaqDi965YQ=
|
||||
github.com/aler9/rtmp v0.0.0-20210403095203-3be4a5535927/go.mod h1:vzuE21rowz+lT1NGsWbreIvYulgBpCGnQyeTyFblUHc=
|
||||
github.com/asticode/go-astikit v0.20.0 h1:+7N+J4E4lWx2QOkRdOf6DafWJMv6O4RRfgClwQokrH8=
|
||||
|
|
|
|||
|
|
@ -263,10 +263,12 @@ func (c *Converter) runInner(innerCtx context.Context) error {
|
|||
|
||||
c.path = res.Path
|
||||
var videoTrack *gortsplib.Track
|
||||
videoTrackID := -1
|
||||
var h264SPS []byte
|
||||
var h264PPS []byte
|
||||
var h264Decoder *rtph264.Decoder
|
||||
var audioTrack *gortsplib.Track
|
||||
audioTrackID := -1
|
||||
var aacConfig rtpaac.MPEG4AudioConfig
|
||||
var aacDecoder *rtpaac.Decoder
|
||||
|
||||
|
|
@ -275,7 +277,9 @@ func (c *Converter) runInner(innerCtx context.Context) error {
|
|||
if videoTrack != nil {
|
||||
return fmt.Errorf("can't read track %d with HLS: too many tracks", i+1)
|
||||
}
|
||||
|
||||
videoTrack = t
|
||||
videoTrackID = i
|
||||
|
||||
var err error
|
||||
h264SPS, h264PPS, err = t.ExtractDataH264()
|
||||
|
|
@ -289,7 +293,9 @@ func (c *Converter) runInner(innerCtx context.Context) error {
|
|||
if audioTrack != nil {
|
||||
return fmt.Errorf("can't read track %d with HLS: too many tracks", i+1)
|
||||
}
|
||||
|
||||
audioTrack = t
|
||||
audioTrackID = i
|
||||
|
||||
byts, err := t.ExtractDataAAC()
|
||||
if err != nil {
|
||||
|
|
@ -350,7 +356,7 @@ func (c *Converter) runInner(innerCtx context.Context) error {
|
|||
}
|
||||
pair := data.(trackIDPayloadPair)
|
||||
|
||||
if videoTrack != nil && pair.trackID == videoTrack.ID {
|
||||
if videoTrack != nil && pair.trackID == videoTrackID {
|
||||
var pkt rtp.Packet
|
||||
err := pkt.Unmarshal(pair.buf)
|
||||
if err != nil {
|
||||
|
|
@ -454,7 +460,7 @@ func (c *Converter) runInner(innerCtx context.Context) error {
|
|||
}
|
||||
}
|
||||
|
||||
} else if audioTrack != nil && pair.trackID == audioTrack.ID {
|
||||
} else if audioTrack != nil && pair.trackID == audioTrackID {
|
||||
aus, pts, err := aacDecoder.Decode(pair.buf)
|
||||
if err != nil {
|
||||
if err != rtpaac.ErrMorePacketsNeeded {
|
||||
|
|
|
|||
|
|
@ -233,8 +233,10 @@ func (c *Conn) runRead(ctx context.Context) error {
|
|||
c.path = res.Path
|
||||
|
||||
var videoTrack *gortsplib.Track
|
||||
videoTrackID := -1
|
||||
var h264Decoder *rtph264.Decoder
|
||||
var audioTrack *gortsplib.Track
|
||||
audioTrackID := -1
|
||||
var audioClockRate int
|
||||
var aacDecoder *rtpaac.Decoder
|
||||
|
||||
|
|
@ -245,6 +247,7 @@ func (c *Conn) runRead(ctx context.Context) error {
|
|||
}
|
||||
|
||||
videoTrack = t
|
||||
videoTrackID = i
|
||||
h264Decoder = rtph264.NewDecoder()
|
||||
|
||||
} else if t.IsAAC() {
|
||||
|
|
@ -253,6 +256,7 @@ func (c *Conn) runRead(ctx context.Context) error {
|
|||
}
|
||||
|
||||
audioTrack = t
|
||||
audioTrackID = i
|
||||
audioClockRate, _ = audioTrack.ClockRate()
|
||||
aacDecoder = rtpaac.NewDecoder(audioClockRate)
|
||||
}
|
||||
|
|
@ -291,7 +295,7 @@ func (c *Conn) runRead(ctx context.Context) error {
|
|||
}
|
||||
pair := data.(trackIDPayloadPair)
|
||||
|
||||
if videoTrack != nil && pair.trackID == videoTrack.ID {
|
||||
if videoTrack != nil && pair.trackID == videoTrackID {
|
||||
nalus, pts, err := h264Decoder.Decode(pair.buf)
|
||||
if err != nil {
|
||||
if err != rtph264.ErrMorePacketsNeeded {
|
||||
|
|
@ -335,7 +339,7 @@ func (c *Conn) runRead(ctx context.Context) error {
|
|||
videoBuf = nil
|
||||
}
|
||||
|
||||
} else if audioTrack != nil && pair.trackID == audioTrack.ID {
|
||||
} else if audioTrack != nil && pair.trackID == audioTrackID {
|
||||
aus, pts, err := aacDecoder.Decode(pair.buf)
|
||||
if err != nil {
|
||||
if err != rtpaac.ErrMorePacketsNeeded {
|
||||
|
|
@ -369,24 +373,24 @@ func (c *Conn) runPublish(ctx context.Context) error {
|
|||
}
|
||||
|
||||
var tracks gortsplib.Tracks
|
||||
var h264Encoder *rtph264.Encoder
|
||||
var aacEncoder *rtpaac.Encoder
|
||||
videoTrackID := -1
|
||||
audioTrackID := -1
|
||||
|
||||
var h264Encoder *rtph264.Encoder
|
||||
if videoTrack != nil {
|
||||
h264Encoder = rtph264.NewEncoder(96, nil, nil, nil)
|
||||
videoTrackID = len(tracks)
|
||||
tracks = append(tracks, videoTrack)
|
||||
}
|
||||
|
||||
var aacEncoder *rtpaac.Encoder
|
||||
if audioTrack != nil {
|
||||
clockRate, _ := audioTrack.ClockRate()
|
||||
aacEncoder = rtpaac.NewEncoder(96, clockRate, nil, nil, nil)
|
||||
audioTrackID = len(tracks)
|
||||
tracks = append(tracks, audioTrack)
|
||||
}
|
||||
|
||||
for i, t := range tracks {
|
||||
t.ID = i
|
||||
}
|
||||
|
||||
pathName, query := pathNameAndQuery(c.conn.URL())
|
||||
|
||||
resc := make(chan readpublisher.AnnounceRes)
|
||||
|
|
@ -499,7 +503,7 @@ func (c *Conn) runPublish(ctx context.Context) error {
|
|||
}
|
||||
|
||||
for _, frame := range frames {
|
||||
onFrame(videoTrack.ID, frame)
|
||||
onFrame(videoTrackID, frame)
|
||||
}
|
||||
|
||||
case av.AAC:
|
||||
|
|
@ -513,7 +517,7 @@ func (c *Conn) runPublish(ctx context.Context) error {
|
|||
}
|
||||
|
||||
for _, frame := range frames {
|
||||
onFrame(audioTrack.ID, frame)
|
||||
onFrame(audioTrackID, frame)
|
||||
}
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -153,10 +153,13 @@ func (s *Source) runInner() bool {
|
|||
}
|
||||
|
||||
var tracks gortsplib.Tracks
|
||||
videoTrackID := -1
|
||||
audioTrackID := -1
|
||||
|
||||
var h264Encoder *rtph264.Encoder
|
||||
if videoTrack != nil {
|
||||
h264Encoder = rtph264.NewEncoder(96, nil, nil, nil)
|
||||
videoTrackID = len(tracks)
|
||||
tracks = append(tracks, videoTrack)
|
||||
}
|
||||
|
||||
|
|
@ -164,13 +167,10 @@ func (s *Source) runInner() bool {
|
|||
if audioTrack != nil {
|
||||
clockRate, _ := audioTrack.ClockRate()
|
||||
aacEncoder = rtpaac.NewEncoder(96, clockRate, nil, nil, nil)
|
||||
audioTrackID = len(tracks)
|
||||
tracks = append(tracks, audioTrack)
|
||||
}
|
||||
|
||||
for i, t := range tracks {
|
||||
t.ID = i
|
||||
}
|
||||
|
||||
s.log(logger.Info, "ready")
|
||||
|
||||
cres := make(chan source.ExtSetReadyRes)
|
||||
|
|
@ -232,7 +232,7 @@ func (s *Source) runInner() bool {
|
|||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
onFrame(videoTrack.ID, pkt)
|
||||
onFrame(videoTrackID, pkt)
|
||||
}
|
||||
|
||||
case av.AAC:
|
||||
|
|
@ -246,7 +246,7 @@ func (s *Source) runInner() bool {
|
|||
}
|
||||
|
||||
for _, pkt := range pkts {
|
||||
onFrame(audioTrack.ID, pkt)
|
||||
onFrame(audioTrackID, pkt)
|
||||
}
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -514,7 +514,7 @@ func TestClientRTSPPublisherOverride(t *testing.T) {
|
|||
})
|
||||
}()
|
||||
|
||||
err = s1.WriteFrame(track.ID, gortsplib.StreamTypeRTP,
|
||||
err = s1.WriteFrame(0, gortsplib.StreamTypeRTP,
|
||||
[]byte{0x01, 0x02, 0x03, 0x04})
|
||||
if ca == "enabled" {
|
||||
require.Error(t, err)
|
||||
|
|
@ -523,7 +523,7 @@ func TestClientRTSPPublisherOverride(t *testing.T) {
|
|||
}
|
||||
|
||||
if ca == "enabled" {
|
||||
err = s2.WriteFrame(track.ID, gortsplib.StreamTypeRTP,
|
||||
err = s2.WriteFrame(0, gortsplib.StreamTypeRTP,
|
||||
[]byte{0x05, 0x06, 0x07, 0x08})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
|
@ -577,7 +577,7 @@ func TestClientRTSPNonCompliantFrameSize(t *testing.T) {
|
|||
})
|
||||
}()
|
||||
|
||||
err = source.WriteFrame(track.ID, gortsplib.StreamTypeRTP, input)
|
||||
err = source.WriteFrame(0, gortsplib.StreamTypeRTP, input)
|
||||
require.NoError(t, err)
|
||||
|
||||
<-frameRecv
|
||||
|
|
@ -641,7 +641,7 @@ func TestClientRTSPNonCompliantFrameSize(t *testing.T) {
|
|||
})
|
||||
}()
|
||||
|
||||
err = source.WriteFrame(track.ID, gortsplib.StreamTypeRTP, input)
|
||||
err = source.WriteFrame(0, gortsplib.StreamTypeRTP, input)
|
||||
require.NoError(t, err)
|
||||
|
||||
<-frameRecv
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue