mirror of
https://github.com/amitbet/vnc2video.git
synced 2025-08-01 21:17:37 +00:00
72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
package encoders
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/jpeg"
|
|
"strings"
|
|
"github.com/amitbet/vnc2video/logger"
|
|
|
|
"github.com/icza/mjpeg"
|
|
)
|
|
|
|
type MJPegImageEncoder struct {
|
|
avWriter mjpeg.AviWriter
|
|
Quality int
|
|
Framerate int32
|
|
closed bool
|
|
}
|
|
|
|
func (enc *MJPegImageEncoder) Init(videoFileName string) {
|
|
fileExt := ".avi"
|
|
if enc.Framerate == 0 {
|
|
enc.Framerate = 12
|
|
}
|
|
if !strings.HasSuffix(videoFileName, fileExt) {
|
|
videoFileName = videoFileName + fileExt
|
|
}
|
|
if enc.Framerate <= 0 {
|
|
enc.Framerate = 5
|
|
}
|
|
avWriter, err := mjpeg.New(videoFileName, 1024, 768, enc.Framerate)
|
|
if err != nil {
|
|
logger.Error("Error during mjpeg init: ", err)
|
|
}
|
|
enc.avWriter = avWriter
|
|
}
|
|
func (enc *MJPegImageEncoder) Run(videoFileName string) {
|
|
enc.Init(videoFileName)
|
|
}
|
|
|
|
func (enc *MJPegImageEncoder) Encode(img image.Image) {
|
|
if enc.closed {
|
|
return
|
|
}
|
|
|
|
buf := &bytes.Buffer{}
|
|
jOpts := &jpeg.Options{Quality: enc.Quality}
|
|
if enc.Quality <= 0 {
|
|
jOpts = nil
|
|
}
|
|
err := jpeg.Encode(buf, img, jOpts)
|
|
if err != nil {
|
|
logger.Error("Error while creating jpeg: ", err)
|
|
}
|
|
|
|
//logger.Tracef("buff: %v\n", buf.Bytes())
|
|
|
|
err = enc.avWriter.AddFrame(buf.Bytes())
|
|
if err != nil {
|
|
logger.Error("Error while adding frame to mjpeg: ", err)
|
|
}
|
|
}
|
|
|
|
func (enc *MJPegImageEncoder) Close() {
|
|
err := enc.avWriter.Close()
|
|
|
|
enc.closed = true
|
|
if err != nil {
|
|
logger.Error("Error while closing mjpeg: ", err)
|
|
}
|
|
}
|