本次极简项目有一个比较相关的任务便是给上传的视频制作封面切片,我们小组在封面制作上搜寻到了两种可行的方案,第一种方案便是七牛云,该方案比较小众,在七牛云官方文档才能发现,另一种便是采用ffmpeg中间件,该方案是网络上流传上一届多数青训营团队采用的方案,接下来详细介绍一下这两种方案如何实现:
一.ffmpeg
go中也包含了ffmpeg的封装包
"github.com/u2takey/ffmpeg-go"
1.实现逻辑:
(1)将上传的视频下载到本地
(2)创建封面存放的临时路径
(3)选择截取第几帧,将参数放入到截取封面函数中
(4)在截取封面函数中调用ffmpeg功能将封面保存,然后上传到云端即可
二.七牛云
本次七牛云的方案来自七牛云官方文档,但是官方文档并没有专门介绍如何截取视频的某一帧,而是一个样例中体现出来。
七牛云官方文档GoSDK:developer.qiniu.com/kodo/1238/g…
首先,在查看文档时七牛云提供了视频单帧缩略图的功能供用户进行
视频单帧缩略图:developer.qiniu.com/dora/1313/v…
但是如何将该功能应用在本次项目上成为了一个问题,经过我们小组成员的仔细查找,终于在一个样例中寻找到了如何使用vframe的功能,官方文档代码如下:
saveMp4Entry := base64.URLEncoding.EncodeToString([]byte(bucket + ":avthumb_test_target.mp4"))
saveJpgEntry := base64.URLEncoding.EncodeToString([]byte(bucket + ":vframe_test_target.jpg"))
//数据处理指令,支持多个指令
avthumbMp4Fop := "avthumb/mp4|saveas/" + saveMp4Entry
vframeJpgFop := "vframe/jpg/offset/1|saveas/" + saveJpgEntry
//连接多个操作指令
persistentOps := strings.Join([]string{avthumbMp4Fop, vframeJpgFop}, ";")
pipeline := "test"
putPolicy := storage.PutPolicy{
Scope: bucket,
PersistentOps: persistentOps,
PersistentPipeline: pipeline,
PersistentNotifyURL: "http://api.example.com/qiniu/pfop/notify",
}
mac := qbox.NewMac(accessKey, secretKey)
upToken := putPolicy.UploadToken(mac)
这里的saveMp4Entry,saveJpgEntry 是七牛云存放视频和图片的路径,如图操作设置putPolicy便可以交由七牛云处理视频截取,不用再将视频下载到本地,省去了本地的I/0操作。
有了这样的逻辑,实现封面切片功能如下:
1.实现逻辑:
(1)配置好七牛云,如图所示:
accessKey := "xxxxxxxxxxxxxx"
secertkey := "xxxxxxxxxxxxxx"
domain := "xxxxxxxxxxxxxx"
bucket := "xxxxxxxxxxxxxx"
accessKey与secretKey是七牛云自带的,每个账号独有,domain是你创建空间的外联,bucket是你给自己存储空间创建的名字,将这些配置加入到QiniuUploader
(2)设置好文件名,和封面名
(3)设置上传策略putPolicy
(4)使用七牛云put/pfop等函数便可成功上传