github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoders/huffyuv-enc.go (about) 1 package encoders 2 3 import ( 4 "errors" 5 "image" 6 "io" 7 "os" 8 "os/exec" 9 "strings" 10 "github.com/amitbet/vnc2video/logger" 11 ) 12 13 // this is a very common loseless encoder (but produces huge files) 14 type HuffYuvImageEncoder struct { 15 FFMpegBinPath string 16 cmd *exec.Cmd 17 input io.WriteCloser 18 closed bool 19 Framerate int 20 } 21 22 func (enc *HuffYuvImageEncoder) Init(videoFileName string) { 23 if enc.Framerate == 0 { 24 enc.Framerate = 12 25 } 26 27 fileExt := ".avi" 28 if !strings.HasSuffix(videoFileName, fileExt) { 29 videoFileName = videoFileName + fileExt 30 } 31 //binary := "./ffmpeg" 32 cmd := exec.Command(enc.FFMpegBinPath, 33 "-f", "image2pipe", 34 "-vcodec", "ppm", 35 //"-r", strconv.Itoa(framerate), 36 "-r", "12", 37 38 //"-re", 39 //"-i", "pipe:0", 40 "-an", //no audio 41 //"-vsync", "2", 42 ///"-probesize", "10000000", 43 "-y", 44 45 "-i", "-", 46 //"–s", "640×360", 47 "-vcodec", "huffyuv", //"libvpx",//"libvpx-vp9"//"libx264" 48 //"-b:v", "0.33M", 49 "-threads", "7", 50 ///"-coder", "1", 51 ///"-bf", "0", 52 ///"-me_method", "hex", 53 //"-speed", "0", 54 //"-lossless", "1", //for vpx 55 // "-an", "-f", "webm", 56 "-preset", "veryfast", 57 //"-tune", "animation", 58 "-maxrate", "0.5M", 59 "-bufsize", "50M", 60 "-g", "250", 61 62 //"-crf", "0", //for lossless encoding!!!! 63 64 //"-rc_lookahead", "16", 65 //"-profile", "0", 66 "-crf", "34", 67 //"-qmax", "51", 68 //"-qmin", "7", 69 //"-slices", "4", 70 //"-vb", "2M", 71 72 videoFileName, 73 ) 74 //cmd := exec.Command("/bin/echo") 75 76 //io.Copy(cmd.Stdout, os.Stdout) 77 cmd.Stdout = os.Stdout 78 cmd.Stderr = os.Stderr 79 80 encInput, err := cmd.StdinPipe() 81 enc.input = encInput 82 if err != nil { 83 logger.Error("can't get ffmpeg input pipe") 84 } 85 enc.cmd = cmd 86 } 87 func (enc *HuffYuvImageEncoder) Run(videoFileName string) error { 88 if _, err := os.Stat(enc.FFMpegBinPath); os.IsNotExist(err) { 89 logger.Error("encoder file doesn't exist in path:", enc.FFMpegBinPath) 90 return errors.New("encoder file doesn't exist in path" + videoFileName) 91 } 92 93 enc.Init(videoFileName) 94 logger.Debugf("launching binary: %v", enc.cmd) 95 err := enc.cmd.Run() 96 if err != nil { 97 logger.Errorf("error while launching ffmpeg: %v\n err: %v", enc.cmd.Args, err) 98 return err 99 } 100 return nil 101 } 102 func (enc *HuffYuvImageEncoder) Encode(img image.Image) { 103 if enc.input == nil || enc.closed { 104 return 105 } 106 107 err := encodePPM(enc.input, img) 108 if err != nil { 109 logger.Error("error while encoding image:", err) 110 } 111 } 112 113 func (enc *HuffYuvImageEncoder) Close() { 114 enc.closed = true 115 //enc.cmd.Process.Kill() 116 }