使用ffmpeg截取视频第一帧图像 | 青训营笔记

631 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 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对配置情况进行检查

image.png

若结果与上图类似,则说明配置成功

安装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
	}
}

运行结果:

image.png

成功生成png图像就说明成功了

异常处理

exec: "ffmpeg": executable file not found in %PATH%

若出现上述错误,可以试着以管理员身份运行goland再进行程序运行