|
- 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
- }
|