package video import ( "bufio" "context" "go.uber.org/zap" "io" "os/exec" "sync" ) func Play(ctx context.Context, file string) error { if file == "" { zap.S().Infoln("video file is empty") return nil } cmd := exec.CommandContext(ctx, "ffplay", "-autoexit", "-fs", file) pipe, err := cmd.StderrPipe() if err != nil { return err } var wait sync.WaitGroup defer wait.Wait() a := make(chan struct{}) defer close(a) wait.Add(1) go func() { defer wait.Done() reader := bufio.NewReader(pipe) for { select { case <-a: default: line, _, err := reader.ReadLine() if err != nil { if err == io.EOF { return } break } zap.L().Info(string(line)) } } }() return cmd.Run() }