Go使用FFmpeg截取视频流第一帧保存为封面图 | 青训营笔记

1,373 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

使用 FFmpeg

由于需要使用 FFmpeg 第三方工具来完成视频截取第一帧作为封面并存储到本机,

所以运行之前需要预先安装 FFmpeg 到本机并配置好环境变量。

安装配置

系统安装

sudo apt-get install ffmpeg

go环境配置

go get -u github.com/u2takey/ffmpeg-go
go get -u github.com/disintegration/imaging

8PR235%$RRVGEWM@)`AJK.png

相关思路

得到视频的存放位置的地址,读取视频流,然后获得第一帧的图片并进行保存,返回图片所在位置,对这一系列功能进行相关的封装

代码展示

函数说明: GetSnapshot()函数传入视频地址和图片名称以及截取的第几帧,返回值是图片的绝对路径

func GetSnapshot(videoPath, imageName string, frameNum int) (ImagePath string, err error) {
   snapshotPath = "/root/videoImage/" + imageName
   buf := bytes.NewBuffer(nil)
   err = ffmpeg.Input(videoPath).Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
      Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
      WithOutput(buf, os.Stdout).
      Run()

   if err != nil {
      log.Fatal("生成缩略图失败:", err)
      return "", err
   }

   img, err := imaging.Decode(buf)
   if err != nil {
      log.Fatal("生成缩略图失败:", err)
      return "", err
   }

   err = imaging.Save(img, snapshotPath+".png")
   if err != nil {
      log.Fatal("生成缩略图失败:", err)
      return "", err
   }

   imgPath := snapshotPath + ".png"

   return imgPath, nil
}

函数主要用于完善 /douyin/publish/action/ 投稿接口,我们将客户端获取的视频进行保存,然后读出视频的第一帧图片作为封面图片,并保存在服务器主机上,获得视频路径,封面图片路径,将一系列值保存在数据库中

finalName := fmt.Sprintf("%d_%s", user.UserID, filename)
saveFile := filepath.Join("/root/video", finalName)

strArray := strings.Split(finalName, ".")
ImageName := strArray[0]

imagePath, _ := GetSnapshot(saveFile, ImageName, 1)

var video models.Video
video.CoverURL = imagePath
video.PlayURL = saveFile
video.Title = title
video.UserID = user.UserID
models.AddVideo(video)