본문 바로가기

Golang

[Golang] 간단 웹캠 스트리밍 서버 구현하기

728x90

이 포스트에서는 golang과 gocv를 이용해 웹캠 이미지를 스트리밍 하는 서버를 구현해 봤다.

 

gocv에 대해 모르고 있다면 여기를 먼저 보고 오도록 하자.

 

구현한 코드에서는 먼저 gocv로 웹캠을 연결하여 프레임을 받아온다. 이 프레임을 이미지로 변환한 다음, http 프로토콜로 전송한다.

 

package main

import (
	"bytes"
	"fmt"
	"image/jpeg"
	"log"
	"net/http"

	"gocv.io/x/gocv"
)

func main() {
	webcam, err := gocv.OpenVideoCapture(0)

	if err != nil {
		log.Fatalf("Error opening webcam: %v", err)
	}
	defer webcam.Close()

	frame := gocv.NewMat()
	defer frame.Close()

	http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "multipart/x-mixed-replace; boundary=frame")

		for {
			if ok := webcam.Read(&frame); !ok {
				log.Println("Cannot read frame from webcam.")
				break
			}

			if frame.Empty() {
				continue
			}

			buf := new(bytes.Buffer)

			img, err := frame.ToImage()

			if err != nil {
				log.Println("Failed to convert frame to image: ", err)
				break
			}

			if err := jpeg.Encode(buf, img, nil); err != nil {
				log.Println("Failed to encode frame: ", err)
				break
			}

			_, err = fmt.Fprintf(w, "--frame\r\nContent-Type: image/jpeg\r\n\r\n")

			if err != nil {
				log.Println("Client disconnected.")
				break
			}

			_, err = w.Write(buf.Bytes())
			if err != nil {
				log.Println("Failed to send frame: ", err)
				break
			}
		}
	})

	fmt.Println("Server is running on port 9999")
	log.Fatal(http.ListenAndServe(":9999", nil))
}

 

해당 서버를 구동한 후 stream 라우트에 접속해 보면 브라우저로 웹캠 스트림이 되고 있는 것을 확인할 수 있다.

728x90

'Golang' 카테고리의 다른 글

Golang에서 opencv 사용해보기 - gocv  (0) 2024.12.28
Golang으로 백준 빠른 입출력  (0) 2024.11.04
Golang으로 postgreSQL 연동  (0) 2024.11.04