github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoders/dv9-enc.go (about) 1 package encoders 2 3 import ( 4 "image" 5 "io" 6 "os" 7 "os/exec" 8 "strings" 9 "github.com/amitbet/vnc2video/logger" 10 ) 11 12 type DV9ImageEncoder struct { 13 cmd *exec.Cmd 14 FFMpegBinPath string 15 input io.WriteCloser 16 Framerate int 17 } 18 19 func (enc *DV9ImageEncoder) Init(videoFileName string) { 20 fileExt := ".mp4" 21 if enc.Framerate == 0 { 22 enc.Framerate = 12 23 } 24 if !strings.HasSuffix(videoFileName, fileExt) { 25 videoFileName = videoFileName + fileExt 26 } 27 binary := "./ffmpeg" 28 cmd := exec.Command(binary, 29 "-f", "image2pipe", 30 "-vcodec", "ppm", 31 //"-r", strconv.Itoa(framerate), 32 "-r", "5", 33 //"-i", "pipe:0", 34 "-i", "-", 35 "-vcodec", "libvpx-vp9", //"libvpx",//"libvpx-vp9"//"libx264" 36 "-b:v", "1M", 37 "-threads", "8", 38 //"-speed", "0", 39 //"-lossless", "1", //for vpx 40 // "-tile-columns", "6", 41 //"-frame-parallel", "1", 42 // "-an", "-f", "webm", 43 "-cpu-used", "-8", 44 45 //"-preset", "ultrafast", 46 "-deadline", "realtime", 47 //"-cpu-used", "-5", 48 "-maxrate", "2.5M", 49 "-bufsize", "10M", 50 "-g", "120", 51 52 //"-rc_lookahead", "16", 53 //"-profile", "0", 54 "-qmax", "51", 55 "-qmin", "11", 56 //"-slices", "4", 57 //"-vb", "2M", 58 59 videoFileName, 60 ) 61 //cmd := exec.Command("/bin/echo") 62 63 //io.Copy(cmd.Stdout, os.Stdout) 64 cmd.Stdout = os.Stdout 65 cmd.Stderr = os.Stderr 66 67 encInput, err := cmd.StdinPipe() 68 enc.input = encInput 69 if err != nil { 70 logger.Error("can't get ffmpeg input pipe") 71 } 72 enc.cmd = cmd 73 } 74 func (enc *DV9ImageEncoder) Run(videoFileName string) { 75 if _, err := os.Stat(enc.FFMpegBinPath); os.IsNotExist(err) { 76 logger.Error("encoder file doesn't exist in path:", enc.FFMpegBinPath) 77 return 78 } 79 80 enc.Init(videoFileName) 81 logger.Debugf("launching binary: %v", enc.cmd) 82 err := enc.cmd.Run() 83 if err != nil { 84 logger.Errorf("error while launching ffmpeg: %v\n err: %v", enc.cmd.Args, err) 85 } 86 } 87 func (enc *DV9ImageEncoder) Encode(img image.Image) { 88 err := encodePPM(enc.input, img) 89 if err != nil { 90 logger.Error("error while encoding image:", err) 91 } 92 } 93 func (enc *DV9ImageEncoder) Close() { 94 95 }