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  }