如何获取视频封面| 青训营笔记

166 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

前言

今天介绍一下在大项目中如何获取视频封面,比较简单直观的方式是利用ffmpeg来截取视频的特定帧,比如固定截取第一帧、中间帧或随机帧。但是实际上在平时使用抖音的过程中,我发现一些用户的主页,他们的视频封面是多张图片来回切换的动态效果。也有部分用户是自己上传了视频的封面.但是受限于apk的功能有限也没办法做更多功能了.

关于ffmpeg (介绍部分内容来源于网络www.oschina.net/p/ffmpeg?hm…

Fmpeg 是领先的多媒体框架,能够解码、编码、转码、混合、解密、流媒体、过滤和播放人类和机器创造的几乎所有东西。它支持最晦涩的古老格式,直到最尖端的格式。无论它们是由某个标准委员会、社区还是公司设计的。它还具有高度的便携性。

FFmpeg 可以在 Linux、Mac OS X、Microsoft Windows、BSDs、Solaris 等各种构建环境、机器架构和配置下编译、运行,并通过测试基础设施 FATE。

它包含了 libavcodec、libavutil、libavformat、libavfilter、libavdevice、libswscale 和 libswresample,可以被应用程序使用。还有 ffmpeg、ffplay 和 ffprobe,可以被终端用户用于转码和播放。

其实只要将其理解为一个视频处理工具就好了,在go语言里使用其实也十分的方便。只需要下面这些代码

	buf := bytes.NewBuffer(nil)
	err := ffmpeg.Input(inFileName).
		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 {
		panic(err)
	}
	return buf
}

reader := ExampleReadFrameAsJpeg("./sample_data/in1.mp4", 5)
img, err := imaging.Decode(reader)
if err != nil {
    t.Fatal(err)
}
err = imaging.Save(img, "./sample_data/out1.jpeg")
if err != nil {
    t.Fatal(err)
}

我们需要做的只是根据自己的视频文件存储路径来修改Input(inFileName)即可