From 7d6a5b44f89107bf5c12af261c1b744b3821008b Mon Sep 17 00:00:00 2001 From: Alexey Khit Date: Fri, 4 Nov 2022 21:22:33 +0300 Subject: [PATCH] Add frame.jpeg api for MJPEG stream --- cmd/mjpeg/mjpeg.go | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/cmd/mjpeg/mjpeg.go b/cmd/mjpeg/mjpeg.go index 6e8e8ceb..cf3c96f0 100644 --- a/cmd/mjpeg/mjpeg.go +++ b/cmd/mjpeg/mjpeg.go @@ -10,12 +10,47 @@ import ( ) func Init() { - api.HandleFunc("api/stream.mjpeg", handler) + api.HandleFunc("api/frame.jpeg", handlerKeyframe) + api.HandleFunc("api/stream.mjpeg", handlerStream) +} + +func handlerKeyframe(w http.ResponseWriter, r *http.Request) { + src := r.URL.Query().Get("src") + stream := streams.GetOrNew(src) + if stream == nil { + return + } + + exit := make(chan []byte) + + cons := &mjpeg.Consumer{} + cons.Listen(func(msg interface{}) { + switch msg := msg.(type) { + case []byte: + exit <- msg + } + }) + + if err := stream.AddConsumer(cons); err != nil { + log.Error().Err(err).Caller().Send() + return + } + + data := <-exit + + stream.RemoveConsumer(cons) + + w.Header().Set("Content-Type", "image/jpeg") + w.Header().Set("Content-Length", strconv.Itoa(len(data))) + + if _, err := w.Write(data); err != nil { + log.Error().Err(err).Caller().Send() + } } const header = "--frame\r\nContent-Type: image/jpeg\r\nContent-Length: " -func handler(w http.ResponseWriter, r *http.Request) { +func handlerStream(w http.ResponseWriter, r *http.Request) { src := r.URL.Query().Get("src") stream := streams.GetOrNew(src) if stream == nil {