这是我参与「第五届青训营 」伴学笔记创作活动的第 9 天
在青训营大项目中,遇到了为视频添加封面的需求,也就是对视频进行截图。ffmpeg作为一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,能够满足这个需求。
通过Go和ffmpeg的交互,可以很好的实现这一目标。
主要流程:
- 创建一个接收上传视频文件的接口
- 在接口中接收上传的文件
- 使用Golang中的 exec 包来执行 FFmpeg 命令对视频进行截图
- 将视频和截图文件上传至文件存储系统,在项目中使用的是 minio
- 并将路径记录在数据库中
可以看到 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