From e985ad23a2a133e45d3bec821f704a324243e2db Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Thu, 20 Apr 2023 16:19:32 +0300 Subject: [PATCH] Fix HLS handler --- cmd/hls/hls.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cmd/hls/hls.go b/cmd/hls/hls.go index e9658538..2cd9685d 100644 --- a/cmd/hls/hls.go +++ b/cmd/hls/hls.go @@ -10,6 +10,7 @@ import ( "github.com/AlexxIT/go2rtc/pkg/tcp" "github.com/rs/zerolog/log" "net/http" + "strings" "sync" "time" ) @@ -48,6 +49,9 @@ const keepalive = 5 * time.Second var sessions = map[string]*Session{} +// once I saw 404 on MP4 segment, so better to use mutex +var sessionsMu sync.RWMutex + func handlerStream(w http.ResponseWriter, r *http.Request) { // CORS important for Chromecast w.Header().Set("Access-Control-Allow-Origin", "*") @@ -128,11 +132,16 @@ segment.ts?id=` + sid + `&n=%d segment.ts?id=` + sid + `&n=%d` } + sessionsMu.Lock() sessions[sid] = session + sessionsMu.Unlock() + + // Apple Safari can play FLAC codec, but fail it it in m3u8 playlist + codecs := strings.Replace(cons.MimeCodecs(), mp4.MimeFlac, mp4.MimeAAC, 1) // bandwidth important for Safari, codecs useful for smooth playback data := []byte(`#EXTM3U -#EXT-X-STREAM-INF:BANDWIDTH=1000000,CODECS="` + cons.MimeCodecs() + `" +#EXT-X-STREAM-INF:BANDWIDTH=1000000,CODECS="` + codecs + `" hls/playlist.m3u8?id=` + sid) if _, err := w.Write(data); err != nil { @@ -150,7 +159,9 @@ func handlerPlaylist(w http.ResponseWriter, r *http.Request) { } sid := r.URL.Query().Get("id") + sessionsMu.RLock() session := sessions[sid] + sessionsMu.RUnlock() if session == nil { http.NotFound(w, r) return @@ -173,7 +184,9 @@ func handlerSegmentTS(w http.ResponseWriter, r *http.Request) { } sid := r.URL.Query().Get("id") + sessionsMu.RLock() session := sessions[sid] + sessionsMu.RUnlock() if session == nil { http.NotFound(w, r) return @@ -212,7 +225,9 @@ func handlerInit(w http.ResponseWriter, r *http.Request) { } sid := r.URL.Query().Get("id") + sessionsMu.RLock() session := sessions[sid] + sessionsMu.RUnlock() if session == nil { http.NotFound(w, r) return @@ -233,7 +248,9 @@ func handlerSegmentMP4(w http.ResponseWriter, r *http.Request) { } sid := r.URL.Query().Get("id") + sessionsMu.RLock() session := sessions[sid] + sessionsMu.RUnlock() if session == nil { http.NotFound(w, r) return