You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
caddy-hugo2/media/video.go

43 lines
1.0 KiB

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
}