github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/encoders/dv8-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 VP8ImageEncoder struct { 13 cmd *exec.Cmd 14 FFMpegBinPath string 15 input io.WriteCloser 16 closed bool 17 Framerate int 18 } 19 20 func (enc *VP8ImageEncoder) Init(videoFileName string) { 21 fileExt := ".webm" 22 if enc.Framerate == 0 { 23 enc.Framerate = 12 24 } 25 if !strings.HasSuffix(videoFileName, fileExt) { 26 videoFileName = videoFileName + fileExt 27 } 28 binary := "./ffmpeg" 29 cmd := exec.Command(binary, 30 "-f", "image2pipe", 31 "-vcodec", "ppm", 32 //"-r", strconv.Itoa(framerate), 33 "-vsync", "2", 34 "-r", "5", 35 "-probesize", "10000000", 36 "-an", //no audio 37 //"-vsync", "2", 38 ///"-probesize", "10000000", 39 "-y", 40 //"-i", "pipe:0", 41 "-i", "-", 42 43 //"-crf", "4", 44 "-vcodec", "libvpx", //"libvpx",//"libvpx-vp9"//"libx264" 45 "-b:v", "0.5M", 46 //"-maxrate", "1.5M", 47 48 "-threads", "8", 49 //"-speed", "0", 50 //"-lossless", "1", //for vpx 51 // "-tile-columns", "6", 52 //"-frame-parallel", "1", 53 // "-an", "-f", "webm", 54 55 //"-preset", "ultrafast", 56 //"-deadline", "realtime", 57 "-quality", "good", 58 "-cpu-used", "-16", 59 "-minrate", "0.2M", 60 "-maxrate", "0.7M", 61 "-bufsize", "50M", 62 "-g", "180", 63 "-keyint_min", "180", 64 "-rc_lookahead", "20", 65 //"-crf", "34", 66 //"-profile", "0", 67 "-qmax", "51", 68 "-qmin", "3", 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 *VP8ImageEncoder) Run(videoFileName string) { 88 if _, err := os.Stat(enc.FFMpegBinPath); os.IsNotExist(err) { 89 logger.Error("encoder file doesn't exist in path:", enc.FFMpegBinPath) 90 return 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 } 99 } 100 func (enc *VP8ImageEncoder) Encode(img image.Image) { 101 if enc.input == nil || enc.closed { 102 return 103 } 104 105 err := encodePPM(enc.input, img) 106 if err != nil { 107 logger.Error("error while encoding image:", err) 108 } 109 } 110 111 func (enc *VP8ImageEncoder) Close() { 112 enc.closed = true 113 }