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  }