使用ffmpeg获取视频封面
什么是ffmpeg
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。
FFmpeg在Linux平台下开发,但它同样也可以在其它操作系统环境中编译运行,包括Windows、Mac OS X等。这个项目最早由Fabrice Bellard发起,2004年至2015年间由Michael Niedermayer主要负责维护。许多FFmpeg的开发人员都来自MPlayer项目,而且当前FFmpeg也是放在MPlayer项目组的服务器上。项目的名称来自MPEG视频编码标准,前面的"FF"代表"Fast Forward"。FFmpeg编码库可以使用GPU加速。
可以在ffmpeg官网下载对应的ffmpeg版本,我下载的是ffmpeg-6.0-full_build版本,安装ffmpeg后,在系统变量中对ffmpeg的变量进行设置。可以使用 cmd
输入 ffmpeg -version
验证是否配置成功。
参考链接:FFmpeg
在 Go 中使用ffmpeg
ffmpeg-go 是一个 Go 语言的 FFmpeg 封装库,提供了简单易用的 API,可以方便地调用 FFmpeg 进行音视频处理。在 Go 中引入 github.com/u2takey/ffmpeg-go
库:
import (
ffmpeg "github.com/u2takey/ffmpeg-go"
)
之后,就可以调用ffmpeg-go库中简单易用的API对音视频进行处理。
Go 获取视频封面实例
如下,是调用ffmpeg获取一个视频的封面的 Go 代码:
package main
import (
"bytes"
"fmt"
"log"
"os"
"strings"
"github.com/disintegration/imaging"
ffmpeg "github.com/u2takey/ffmpeg-go"
)
func GetSnapshot(videoPath, snapshotPath string, frameNum int) (snapshotName string, err error) {
snapshotPath = "./video/" + snapshotPath
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
}
fmt.Println("--snapshotPath--", snapshotPath)
names := strings.Split(snapshotPath, "\\")
fmt.Println("----names----", names)
snapshotName = names[len(names)-1] + ".png"
fmt.Println("----snapshotName----", snapshotName)
return snapshotName, nil
}
func main() {
name, err := GetSnapshot("./video/bear.mp4", "testImage", 1)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("return:", name)
}
主要是调用 GetSnapshot()
函数
第一个参数是 视频的相对地址,第二个参数是截出来的图片的名称,返回值是图片的相对路径
func GetSnapshot(videoPath, snapshotPath string) (snapshotName string, err error)