github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/example/file-reader/main.go (about)

     1  package main
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"time"
     7  	vnc "github.com/amitbet/vnc2video"
     8  	"github.com/amitbet/vnc2video/encoders"
     9  	"github.com/amitbet/vnc2video/logger"
    10  )
    11  
    12  func main() {
    13  	framerate := 10
    14  	speedupFactor := 3.0
    15  	fastFramerate := int(float64(framerate) * speedupFactor)
    16  
    17  	if len(os.Args) <= 1 {
    18  		logger.Errorf("please provide a fbs file name")
    19  		return
    20  	}
    21  	if _, err := os.Stat(os.Args[1]); os.IsNotExist(err) {
    22  		logger.Errorf("File doesn't exist", err)
    23  		return
    24  	}
    25  	encs := []vnc.Encoding{
    26  		&vnc.RawEncoding{},
    27  		&vnc.TightEncoding{},
    28  		&vnc.CopyRectEncoding{},
    29  		&vnc.ZRLEEncoding{},
    30  	}
    31  
    32  	fbs, err := vnc.NewFbsConn(
    33  		os.Args[1],
    34  		encs,
    35  	)
    36  	if err != nil {
    37  		logger.Error("failed to open fbs reader:", err)
    38  		//return nil, err
    39  	}
    40  
    41  	//launch video encoding process:
    42  	vcodec := &encoders.X264ImageEncoder{FFMpegBinPath: "./ffmpeg", Framerate: framerate}
    43  	//vcodec := &encoders.DV8ImageEncoder{}
    44  	//vcodec := &encoders.DV9ImageEncoder{}
    45  	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
    46  	logger.Tracef("current dir: %s", dir)
    47  	go vcodec.Run("./output.mp4")
    48  
    49  	//screenImage := image.NewRGBA(image.Rect(0, 0, int(fbs.Width()), int(fbs.Height())))
    50  	screenImage := vnc.NewVncCanvas(int(fbs.Width()), int(fbs.Height()))
    51  	screenImage.DrawCursor = false
    52  
    53  	for _, enc := range encs {
    54  		myRenderer, ok := enc.(vnc.Renderer)
    55  
    56  		if ok {
    57  			myRenderer.SetTargetImage(screenImage)
    58  		}
    59  	}
    60  
    61  	go func() {
    62  		frameMillis := (1000.0 / float64(fastFramerate)) - 1 //a couple of millis, adjusting for time lost in software commands
    63  		frameDuration := time.Duration(frameMillis * float64(time.Millisecond))
    64  		//logger.Error("milis= ", frameMillis)
    65  
    66  		for {
    67  			timeStart := time.Now()
    68  
    69  			vcodec.Encode(screenImage.Image)
    70  			timeTarget := timeStart.Add(frameDuration)
    71  			timeLeft := timeTarget.Sub(time.Now())
    72  			//.Add(1 * time.Millisecond)
    73  			if timeLeft > 0 {
    74  				time.Sleep(timeLeft)
    75  				//logger.Error("sleeping= ", timeLeft)
    76  			}
    77  		}
    78  	}()
    79  
    80  	msgReader := vnc.NewFBSPlayHelper(fbs)
    81  	//loop over all messages, feed images to video codec:
    82  	for {
    83  		_, err := msgReader.ReadFbsMessage(true, speedupFactor)
    84  		//vcodec.Encode(screenImage.Image)
    85  		if err != nil {
    86  			os.Exit(-1)
    87  		}
    88  		//vcodec.Encode(screenImage)
    89  	}
    90  }