前提简介
之前为了快点写完基础接口和方便调试就直接全部拿给的一张静态图片当做所有视频的封面了。当然这是一个不太好的做法,下面我们就开始分析并开始优化
视频图片封面的截取和实现
-
截取 我们可以使用第三方库
github.com/u2takey/ffmpeg-go和github.com/nfnt/resize来实现视频封面的截取和储存。首先使用ffmpeg从视频文件中提取指定帧作为图像文件,然后使用resize库对图像进行缩放和裁剪。我们可以使用go get -u github.com/nfnt/resize和go get -u github.com/disintegration/imaging来安装这两个库。 -
两个第三方库的介绍:
nfnt/resize是一个用于图像缩放的Go语言库,它提供了多种常见的插值方法。该库的优点在于它能够快速地对图像进行缩放和裁剪,且支持保持纵横比。u2takey/ffmpeg-go是一个用于处理音频和视频文件的 Go 语言库,它基于著名的开源项目FFmpeg。该库的优点在于它能够提供一系列强大的工具来处理多媒体内容,包括录制、转换、编辑和串流音频和视频。 这两个库结合使用,可以实现对视频封面的截取和储存。 -
具体的部分代码实现
package main
import (
"image"
"image/jpeg"
"os"
"github.com/nfnt/resize"
ffmpeg "github.com/u2takey/ffmpeg-go"
)
func main() {
// 从视频中截取一帧
frame, err := ffmpeg.ProbeAndExtractFrame(
ffmpeg.KwArgs{"input": "input.mp4", "frame_pos": 1.0},
)
if err != nil {
panic(err)
}
// 将截取的帧转换为 image.Image 类型
img, _, err := image.Decode(bytes.NewReader(frame))
if err != nil {
panic(err)
}
// 调整图像大小
resizedImg := resize.Resize(300, 0, img, resize.Lanczos3)
// 将调整后的图像保存为文件
out, err := os.Create("output.jpg")
if err != nil {
panic(err)
}
defer out.Close()
jpeg.Encode(out, resizedImg, nil)
}