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() }