这是我参与「第五届青训营」伴学笔记创作活动的第 6 天,今天学习的是使用ffmpeg对视频第一帧的图像进行截取
前言
在go语言中,截取视频中第一帧图像的方法主要有两种,一种是使用opencv的go绑定库,另一种就是使用ffmpeg的go绑定库。在这里,我使用的是第二种方法,即使用ffmpeg对视频图像进行截取。
准备ffmpeg
要使用ffmpeg
,不仅需要在本机下载ffmpeg
并配置好环境变量,
ffmpeg下载
下载地址:Download FFmpeg
在这里我下载的是ffmpeg-full_build
ffmpeg环境变量配置
在环境变量Path
中添加下载的ffmpeg文件的绝对路径
例如,在我这下载的ffmpeg路径为
E:\ffmpeg-full_build\bin
配置好后,可以使用cmd输入ffmpeg -version
对配置情况进行检查
若结果与上图类似,则说明配置成功
安装ffmpeg的go绑定库
go get "github.com/u2takey/ffmpeg-go"
ffmpeg代码
这里主要调用的是GetSnapshot()
函数
func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName string, err error)
videoPath
是视频的路径
snapshotPath
是保存图片的路径,最后保存的图片地址为snapshotPath.png
在这里使用项目自带的bear.mp4
作为举例,将main代码放于与视频相同的文件夹中
代码:
package main
import (
"bytes"
"fmt"
"github.com/disintegration/imaging"
ffmpeg "github.com/u2takey/ffmpeg-go"
"log"
"os"
"strings"
)
func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName string, err error) {
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
}
names := strings.Split(snapshotPath, "\\")
snapshotName = names[len(names)-1] + ".png"
return
}
func main() {
_, err := GetSnapshot("./bear.mp4", "bear", 1)
if err != nil {
return
}
}
运行结果:
成功生成png图像就说明成功了
异常处理
exec: "ffmpeg": executable file not found in %PATH%
若出现上述错误,可以试着以管理员身份运行goland再进行程序运行