diff --git a/internal/hls/hls.go b/internal/hls/hls.go index 096cde6f..a1b7e81d 100644 --- a/internal/hls/hls.go +++ b/internal/hls/hls.go @@ -3,12 +3,13 @@ package hls import ( "github.com/AlexxIT/go2rtc/internal/api" "github.com/AlexxIT/go2rtc/internal/api/ws" + "github.com/AlexxIT/go2rtc/internal/app" "github.com/AlexxIT/go2rtc/internal/streams" "github.com/AlexxIT/go2rtc/pkg/core" "github.com/AlexxIT/go2rtc/pkg/mp4" "github.com/AlexxIT/go2rtc/pkg/mpegts" "github.com/AlexxIT/go2rtc/pkg/tcp" - "github.com/rs/zerolog/log" + "github.com/rs/zerolog" "net/http" "strings" "sync" @@ -16,6 +17,8 @@ import ( ) func Init() { + log = app.GetLogger("hls") + api.HandleFunc("api/stream.m3u8", handlerStream) api.HandleFunc("api/hls/playlist.m3u8", handlerPlaylist) @@ -37,6 +40,8 @@ type Consumer interface { Start() } +var log zerolog.Logger + const keepalive = 5 * time.Second var sessions = map[string]*Session{} @@ -94,15 +99,19 @@ func handlerStream(w http.ResponseWriter, r *http.Request) { } }) + sid := core.RandString(8, 62) + session.alive = time.AfterFunc(keepalive, func() { + sessionsMu.Lock() + delete(sessions, sid) + sessionsMu.Unlock() + stream.RemoveConsumer(cons) }) session.init, _ = cons.Init() cons.Start() - sid := core.RandString(8, 62) - // two segments important for Chromecast if medias != nil { session.template = `#EXTM3U @@ -187,6 +196,7 @@ func handlerSegmentTS(w http.ResponseWriter, r *http.Request) { data := session.Segment() if data == nil { + log.Warn().Msgf("[hls] can't get segment %s", r.URL.RawQuery) http.NotFound(w, r) return } @@ -219,6 +229,7 @@ func handlerInit(w http.ResponseWriter, r *http.Request) { session.segment0 = session.Segment() if session.segment0 == nil { + log.Warn().Msgf("[hls] can't get init %s", r.URL.RawQuery) http.NotFound(w, r) return } @@ -259,6 +270,7 @@ func handlerSegmentMP4(w http.ResponseWriter, r *http.Request) { } if data == nil { + log.Warn().Msgf("[hls] can't get segment %s", r.URL.RawQuery) http.NotFound(w, r) return } diff --git a/internal/hls/session.go b/internal/hls/session.go index 6f4d66ed..e28ab184 100644 --- a/internal/hls/session.go +++ b/internal/hls/session.go @@ -22,7 +22,7 @@ func (s *Session) Playlist() string { } func (s *Session) Segment() (segment []byte) { - for i := 0; i < 20 && segment == nil; i++ { + for i := 0; i < 60 && segment == nil; i++ { if i > 0 { time.Sleep(50 * time.Millisecond) } diff --git a/internal/hls/ws.go b/internal/hls/ws.go index c25485c5..861c948a 100644 --- a/internal/hls/ws.go +++ b/internal/hls/ws.go @@ -8,7 +8,6 @@ import ( "github.com/AlexxIT/go2rtc/pkg/core" "github.com/AlexxIT/go2rtc/pkg/mp4" "github.com/AlexxIT/go2rtc/pkg/tcp" - "github.com/rs/zerolog/log" "strings" "time" ) @@ -22,6 +21,8 @@ func handlerWSHLS(tr *ws.Transport, msg *ws.Message) error { codecs := msg.String() + log.Trace().Msgf("[hls] new ws consumer codecs=%s", codecs) + cons := &mp4.Consumer{ Desc: "HLS/WebSocket", RemoteAddr: tcp.RemoteAddr(tr.Request),