diff --git a/pkg/rtsp/conn.go b/pkg/rtsp/conn.go index dbf56eaa..259b5786 100644 --- a/pkg/rtsp/conn.go +++ b/pkg/rtsp/conn.go @@ -404,6 +404,12 @@ func (c *Conn) SetupMedia( } } + // in case the track has already been setup before + if codec == nil { + c.state = StateSetup + return nil, nil + } + // we send our `interleaved`, but camera can answer with another // Transport: RTP/AVP/TCP;unicast;interleaved=10-11;ssrc=10117CB7 diff --git a/pkg/rtsp/streamer.go b/pkg/rtsp/streamer.go index 6f37cd9e..d8505576 100644 --- a/pkg/rtsp/streamer.go +++ b/pkg/rtsp/streamer.go @@ -20,9 +20,10 @@ func (c *Conn) GetTrack(media *streamer.Media, codec *streamer.Codec) *streamer. } } - // can't setup new tracks from play state + // can't setup new tracks from play state - forcing a reconnection feature if c.state == StatePlay { - return nil + go c.Close() + return streamer.NewTrack(codec, media.Direction) } track, err := c.SetupMedia(media, codec)