ffmpeg 实现视频截图 | 青训营大项目笔记

417 阅读2分钟

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

在青训营大项目中,遇到了为视频添加封面的需求,也就是对视频进行截图。ffmpeg作为一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,能够满足这个需求。

通过Go和ffmpeg的交互,可以很好的实现这一目标。

主要流程:

  1. 创建一个接收上传视频文件的接口
  2. 在接口中接收上传的文件
  3. 使用Golang中的 exec 包来执行 FFmpeg 命令对视频进行截图
  4. 将视频和截图文件上传至文件存储系统,在项目中使用的是 minio
  5. 并将路径记录在数据库中

可以看到 exec包FFmpeg 是这一需求的主要核心,下面就简单介绍一下

os/exec

通过 os/exec 这个包,我们可以运行任意的命令。

这是构建ls命令的示例 - cmd := exec.Command("ls","-a"),通过 Command 函数可以实现对命令的构建,而通过 Run 能够实现命令的执行,通过 Output能执行函数并返回输出,CombinedOutput 则能组合输出运行该命令并返回其组合的标准输出和标准错误。

FFmpeg 命令

-i filename 指定输入文件名

-ss time_off 从指定的时间开始,格式1-hh:mm:ss;格式2:.xxx(指定秒,精确到ms)

-frames:v 1 指定只截取一帧

xxx.jpg 指定输出文件

实践

通过以上对 os/exec 和 FFmpeg 命令的了解,可以简单的构造出对视频进行截图的函数

// videoPath 视频路径 imgPath 图片路径 time 截图时间
func GetCover(videoPath string, imgPath string, time string) error {
   cmd := exec.Command("ffmpeg", "-i", videoPath, "-ss", time, "-frames:v","1", imgPath)
   output, err := cmd.CombinedOutput()
   if err != nil {
      return err
   }
   return err
}

需要注意的是,在安装完 ffmpeg 更改好环境变量后,要重启 IDE,才能使程序正常调用 ffmepg