package media import ( "bytes" "fmt" "image" "os" "os/exec" "path" "path/filepath" ) func VideoFrame(filename string) (image.Image, error) { cmd := exec.Command("ffmpeg", "-i", filename, "-vframes", "1", "-f", "singlejpeg", "-") buffer := new(bytes.Buffer) cmd.Stdout = buffer if cmd.Run() != nil { return nil, fmt.Errorf("could not generate frame") } img, _, err := image.Decode(buffer) return img, err } func VideoSize(filename string) (image.Rectangle, error) { img, err := VideoFrame(filename) if err != nil { return image.Rectangle{}, err } return img.Bounds(), nil } func VideoEncode(filename string, size image.Rectangle, thumbDir string) error { dest := thumbFilename(thumbDir, size, path.Base(filename)) os.MkdirAll(filepath.Dir(dest), 0755) cmd := exec.Command("ffmpeg", "-i", filename, "-vf", fmt.Sprintf("scale=%d:%d", size.Dx(), size.Dy()), "-strict", "-2", dest) if out, err := cmd.CombinedOutput(); err != nil { os.Remove(dest) return fmt.Errorf("could not thumb video: %s", string(out)) } return nil }