使用ffmpeg获取视频封面 | 青训营

2023年 8月 28日 23.0k 0

使用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)

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论