使用FFmpeg提取视频封面 | 青训营笔记

229 阅读2分钟

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

在开发大项目的时候,有一个需求是用户发布视频,同时还要生成视频的缩略图。前端发送来的数据只有视频的内容,而没有缩略图,因此我们需要自己生成一个缩略图。

我选择了FFmpeg包来生成缩略图。

以下是基本代码

func GetFirstFrame(DirPath, videoName string, frameNum int) (imageName string, err error) {
   videoFullPath := DirPath + "/" + videoName
   imageName = videoName + ".png"
   imageFullPath := DirPath + "/" + imageName
   buf := bytes.NewBuffer(nil)
   err = ffmpeg.Input(videoFullPath).
      Filter("select", ffmpeg.Args{fmt.Sprintf("gte(n,%d)", frameNum)}).
      Output("pipe:", ffmpeg.KwArgs{"vframes": 1, "format": "image2", "vcodec": "mjpeg"}).
      WithOutput(buf).
      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, imageFullPath)
   if err != nil {
      log.Fatal("生成缩略图失败:", err)
      return "", err
   }
   return imageName, nil
}

注意,我们需要使用FFmpeg,在Ubuntu上的安装命令为

sudo apt install ffmpeg

其中,我们需要依赖以下两个包

"github.com/disintegration/imaging"
ffmpeg "github.com/u2takey/ffmpeg-go"

整体上使用还是非常简单的。 以下是关于FFmpeg的介绍

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。

FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括WindowsMac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。 [1]  FFmpeg编码库可以使用GPU加速。