mirror of
https://github.com/amitbet/vnc2video.git
synced 2025-09-09 08:39:17 +00:00
fixed rfb encoding (file-reader)
This commit is contained in:
@@ -1,15 +1,18 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"image"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
vnc "vnc2video"
|
||||
"vnc2video/encoders"
|
||||
"vnc2video/logger"
|
||||
)
|
||||
|
||||
func main() {
|
||||
framerate := 10
|
||||
speedupFactor := 3.6
|
||||
fastFramerate := int(float64(framerate) * speedupFactor)
|
||||
|
||||
if len(os.Args) <= 1 {
|
||||
logger.Errorf("please provide a fbs file name")
|
||||
@@ -22,6 +25,8 @@ func main() {
|
||||
encs := []vnc.Encoding{
|
||||
&vnc.RawEncoding{},
|
||||
&vnc.TightEncoding{},
|
||||
&vnc.CopyRectEncoding{},
|
||||
&vnc.ZRLEEncoding{},
|
||||
}
|
||||
|
||||
fbs, err := vnc.NewFbsConn(
|
||||
@@ -34,14 +39,17 @@ func main() {
|
||||
}
|
||||
|
||||
//launch video encoding process:
|
||||
vcodec := &encoders.X264ImageEncoder{FFMpegBinPath: "./ffmpeg"}
|
||||
vcodec := &encoders.X264ImageEncoder{FFMpegBinPath: "./ffmpeg", Framerate: framerate}
|
||||
//vcodec := &encoders.DV8ImageEncoder{}
|
||||
//vcodec := &encoders.DV9ImageEncoder{}
|
||||
dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
|
||||
logger.Tracef("current dir: %s", dir)
|
||||
go vcodec.Run("./output.mp4")
|
||||
|
||||
screenImage := image.NewRGBA(image.Rect(0, 0, int(fbs.Width()), int(fbs.Height())))
|
||||
//screenImage := image.NewRGBA(image.Rect(0, 0, int(fbs.Width()), int(fbs.Height())))
|
||||
screenImage := vnc.NewVncCanvas(int(fbs.Width()), int(fbs.Height()))
|
||||
screenImage.DrawCursor = false
|
||||
|
||||
for _, enc := range encs {
|
||||
myRenderer, ok := enc.(vnc.Renderer)
|
||||
|
||||
@@ -50,11 +58,33 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
msgReader := vnc.NewFBSPlayHelper(fbs)
|
||||
go func() {
|
||||
frameMillis := (1000.0 / float64(fastFramerate)) - 2 //a couple of millis, adjusting for time lost in software commands
|
||||
frameDuration := time.Duration(frameMillis * float64(time.Millisecond))
|
||||
//logger.Error("milis= ", frameMillis)
|
||||
|
||||
for {
|
||||
timeStart := time.Now()
|
||||
|
||||
vcodec.Encode(screenImage.Image)
|
||||
timeTarget := timeStart.Add(frameDuration)
|
||||
timeLeft := timeTarget.Sub(time.Now())
|
||||
//.Add(1 * time.Millisecond)
|
||||
if timeLeft > 0 {
|
||||
time.Sleep(timeLeft)
|
||||
//logger.Error("sleeping= ", timeLeft)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
msgReader := vnc.NewFBSPlayHelper(fbs)
|
||||
//loop over all messages, feed images to video codec:
|
||||
for {
|
||||
msgReader.ReadFbsMessage()
|
||||
vcodec.Encode(screenImage)
|
||||
_, err := msgReader.ReadFbsMessage(true, speedupFactor)
|
||||
//vcodec.Encode(screenImage.Image)
|
||||
if err != nil {
|
||||
os.Exit(-1)
|
||||
}
|
||||
//vcodec.Encode(screenImage)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user