64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package visualizer
|
|
|
|
import (
|
|
"fmt"
|
|
"image/color"
|
|
"maze-solver/io/writer"
|
|
"maze-solver/maze"
|
|
"os"
|
|
"os/exec"
|
|
"path"
|
|
|
|
"github.com/mazznoer/colorgrad"
|
|
)
|
|
|
|
type VideoVisualizer struct {
|
|
Filename string
|
|
Framerate float64
|
|
ffmpeg_cmd string
|
|
}
|
|
|
|
func (v *VideoVisualizer) Init(*maze.Maze) {
|
|
path, err := exec.LookPath("ffmpeg")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
v.ffmpeg_cmd = path
|
|
}
|
|
func (v *VideoVisualizer) Run(lets_go chan<- bool) { lets_go <- true }
|
|
|
|
func (v *VideoVisualizer) Visualize(solved_chan <-chan *maze.SolvedMaze) {
|
|
tmp_dir, err := os.MkdirTemp("", "maze-solver-go-")
|
|
defer os.RemoveAll(tmp_dir)
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
i := 0
|
|
for solved := range solved_chan {
|
|
img_writer := writer.ImageWriter{
|
|
Filename: path.Join(tmp_dir, fmt.Sprintf("%07v.png", i)),
|
|
Maze: solved,
|
|
CellWidth: 5,
|
|
CellHeight: 5,
|
|
WallColor: color.Black,
|
|
PathColor: color.White,
|
|
SolutionGradient: colorgrad.Warm(),
|
|
}
|
|
img_writer.Write()
|
|
i++
|
|
}
|
|
cmd := exec.Command(
|
|
v.ffmpeg_cmd,
|
|
"-y",
|
|
"-pattern_type", "glob",
|
|
"-i", path.Join(tmp_dir, "*.png"),
|
|
"-r", fmt.Sprint(int(v.Framerate)),
|
|
v.Filename,
|
|
)
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|