diff --git a/.gitignore b/.gitignore index 8ba7b6a..14a95f8 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ vnc-recorder # Output of the go coverage tool, specifically when used with LiteIDE *.out /vendor + +.DS_Store diff --git a/encoder.go b/encoder.go index 287a266..978daae 100644 --- a/encoder.go +++ b/encoder.go @@ -17,6 +17,7 @@ import ( "os" "os/exec" "strconv" + "time" ) func encodePPMforRGBA(w io.Writer, img *image.RGBA) error { @@ -126,6 +127,7 @@ func (enc *X264ImageCustomEncoder) Init(videoFileName string) { "-an", // no audio "-y", "-i", "-", + "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2", "-vcodec", "libx264", "-preset", "veryfast", "-g", "250", @@ -157,15 +159,17 @@ func (enc *X264ImageCustomEncoder) Run(videoFileName string) error { } return nil } -func (enc *X264ImageCustomEncoder) Encode(img image.Image) { +func (enc *X264ImageCustomEncoder) Encode(img image.Image) error { if enc.input == nil || enc.closed { - return + return nil } err := encodePPM(enc.input, img) if err != nil { logrus.WithError(err).Error("error while encoding image.") + return err } + return nil } func (enc *X264ImageCustomEncoder) Close() { @@ -177,5 +181,6 @@ func (enc *X264ImageCustomEncoder) Close() { if err != nil { logrus.WithError(err).Error("could not close input.") } + time.Sleep(2 * time.Second) } diff --git a/main.go b/main.go index 3dbc3e5..ed26db6 100644 --- a/main.go +++ b/main.go @@ -147,6 +147,7 @@ func vcodecRun(vcodec *X264ImageCustomEncoder, c *cli.Context, outfileName strin cchServer := make(chan vnc.ServerMessage) cchClient := make(chan vnc.ClientMessage) errorCh := make(chan error) + errorCh2 := make(chan error) var secHandlers []vnc.SecurityHandler @@ -221,7 +222,11 @@ func vcodecRun(vcodec *X264ImageCustomEncoder, c *cli.Context, outfileName strin for { timeStart := time.Now() - vcodec.Encode(screenImage.Image) + err := vcodec.Encode(screenImage.Image) + if err != nil { + errorCh2<-err + return + } timeTarget := timeStart.Add((1000 / time.Duration(vcodec.Framerate)) * time.Millisecond) timeLeft := timeTarget.Sub(time.Now()) @@ -248,6 +253,9 @@ func vcodecRun(vcodec *X264ImageCustomEncoder, c *cli.Context, outfileName strin select { case err := <-errorCh: panic(err) + case err := <-errorCh2: + logrus.WithField("error", err).Error("Encoded error received.") + vcodec.Close() case msg := <-cchClient: logrus.WithFields(logrus.Fields{ "messageType": msg.Type(), @@ -272,8 +280,6 @@ func vcodecRun(vcodec *X264ImageCustomEncoder, c *cli.Context, outfileName strin if signal != nil { logrus.WithField("signal", signal).Info("signal received.") vcodec.Close() - // give some time to write the file - time.Sleep(time.Second * 1) os.Exit(0) } } @@ -325,8 +331,11 @@ func recorder(c *cli.Context) error { if c.Int("splitfile") > 0 { ticker := time.NewTicker(time.Duration(c.Int("splitfile")) * time.Minute) - go vcodecRun(vcodec, c, outfileName) - + go func() { + for { + vcodecRun(vcodec, c, outfileName) + } + }() for { select { case _ = <-ticker.C: