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  }