Skip to content

Instantly share code, notes, and snippets.

@chertov
Created January 18, 2020 13:26
Show Gist options
  • Save chertov/bdf2fc2f70a4539f4f2a51db4a93da5f to your computer and use it in GitHub Desktop.
Save chertov/bdf2fc2f70a4539f4f2a51db4a93da5f to your computer and use it in GitHub Desktop.
MJPEG to http jpeg server
package main
import (
"bufio"
"flag"
"log"
"net/http"
"strconv"
"strings"
"sync"
)
var JpegData []byte
var mux sync.Mutex
func loadHTTP(url string) {
resp, err := http.Get(url)
if err != nil {
log.Fatalln("Can't connect to HTTP server '" + url + "':\n", err)
}
defer resp.Body.Close()
log.Println("HTTP connected '" + url + "'")
b := bufio.NewReaderSize(resp.Body, 1*1024*1024)
for {
var line []byte
var err error
line, _, err = b.ReadLine() // --boundarydonotcross
if err != nil { log.Fatal("Error Reading: ", err); break }
line, _, err = b.ReadLine() // Content-Type:image/jpeg
if err != nil { log.Fatal("Error Reading: ", err); break }
line, _, err = b.ReadLine() // Content-Length: 22130
contentLength := string(line)
if err != nil { log.Fatal("Error Reading: ", err); break }
line, _, err = b.ReadLine() // empty line
if err != nil { log.Fatal("Error Reading: ", err); break }
contentLength = strings.ReplaceAll(contentLength, "Content-Length: ", "")
contentLen, err := strconv.ParseInt(contentLength, 10, 64)
if err != nil { log.Fatal("Error parse Content-Length", err); break }
// println("contentLength: ", contentLen)
_, err = b.Peek(int(contentLen))
if err != nil { log.Fatal("Error b.Peek: ", err); break }
jpegBuf := make([]byte, contentLen)
n, err := b.Read(jpegBuf)
if err != nil { log.Fatal("Error b.Peek: ", err); break }
if n != int(contentLen) { log.Fatalln("n != contentLen", n, contentLen)}
mux.Lock()
JpegData = jpegBuf
mux.Unlock()
_, _, err = b.ReadLine() // empty line
if n != int(contentLen) { log.Fatalln("b.ReadLine()", err)}
}
}
func getJpeg(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "image/jpeg")
mux.Lock()
defer mux.Unlock()
w.Header().Set("Content-Length", strconv.Itoa(len(JpegData)))
w.WriteHeader(http.StatusOK)
// log.Println(len(JpegData))
w.Write(JpegData)
}
var mjpegUrl = flag.String("mjpeg", "http://192.168.3.21:8080/mjpeg", "mjpeg url")
func main() {
flag.Parse()
go loadHTTP(*mjpegUrl)
http.HandleFunc("/image.jpg", getJpeg)
err := http.ListenAndServe("0.0.0.0:8090", nil)
if err != nil { log.Fatalln(err) }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment