视频图片的截取 | 青训营

163 阅读1分钟

前提简介

之前为了快点写完基础接口和方便调试就直接全部拿给的一张静态图片当做所有视频的封面了。当然这是一个不太好的做法,下面我们就开始分析并开始优化

视频图片封面的截取和实现

  • 截取 我们可以使用第三方库 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)
}