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 }