stream-poc/server/main.go
2025-10-07 21:38:17 +02:00

54 lines
1.1 KiB
Go

package main
import (
"os/exec"
"strings"
"github.com/gin-gonic/gin"
)
func segmentHandler(ctx *gin.Context) {
segment := ctx.Param("segment")
if !strings.HasSuffix(segment, ".ts") {
ctx.Status(404)
return
}
cmd := exec.Command(
"/usr/bin/ffmpeg",
"-nostdin", "-hide_banner", "-loglevel", "error",
"-hwaccel", "cuda", "-hwaccel_output_format", "cuda",
"-i", "../video/"+segment,
"-vf", "scale_cuda=1280:720",
"-copyts",
"-c:v", "hevc_nvenc", "-preset", "fast",
"-c:a", "copy",
"-f", "mpegts", "-mpegts_copyts", "1",
"-")
stdout, err := cmd.StdoutPipe()
if err != nil {
panic(err)
}
cmd.Start()
//data, _ := cmd.Output()
/*
f, err := os.OpenFile("../reencoded/"+segment, os.O_RDONLY, 0)
if err != nil {
panic(err)
}
*/
//ctx.Data(200, "video/MP2T; charset=binary", data)
ctx.DataFromReader(200, -1, "video/MP2T; charset=binary", stdout, nil)
}
func main() {
// Note: the working directory should be one level above
router := gin.Default()
router.StaticFile("/", "../index.html")
router.StaticFile("/video/bbb.m3u8", "../video/bbb.m3u8")
router.GET("/video/:segment", segmentHandler)
router.Run()
}