ffmpeg.go 970 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. package util
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/disintegration/imaging"
  6. "github.com/u2takey/ffmpeg-go"
  7. "log"
  8. "os"
  9. "strings"
  10. )
  11. // GetSnapshot 生成视频缩略图并保存(作为封面)
  12. func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName string) {
  13. buf := bytes.NewBuffer(nil)
  14. err := ffmpeg_go.Input(videoPath).
  15. Filter("select", ffmpeg_go.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
  16. Output("pipe:", ffmpeg_go.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
  17. WithOutput(buf, os.Stdout).
  18. Run()
  19. if err != nil {
  20. log.Fatal("生成缩略图失败:", err)
  21. }
  22. img, err := imaging.Decode(buf)
  23. if err != nil {
  24. log.Fatal("生成缩略图失败:", err)
  25. }
  26. err = imaging.Save(img, snapshotPath+".jpeg")
  27. if err != nil {
  28. log.Fatal("生成缩略图失败:", err)
  29. }
  30. // 成功则返回生成的缩略图名
  31. names := strings.Split(snapshotPath, "\\")
  32. snapshotName = names[len(names)-1] + ".jpeg"
  33. return
  34. }