这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
使用 FFmpeg
由于需要使用 FFmpeg 第三方工具来完成视频截取第一帧作为封面并存储到本机,
所以运行之前需要预先安装 FFmpeg 到本机并配置好环境变量。
安装配置
系统安装
sudo apt-get install ffmpeg
go环境配置
go get -u github.com/u2takey/ffmpeg-go
go get -u github.com/disintegration/imaging
相关思路
得到视频的存放位置的地址,读取视频流,然后获得第一帧的图片并进行保存,返回图片所在位置,对这一系列功能进行相关的封装
代码展示
函数说明: GetSnapshot()函数传入视频地址和图片名称以及截取的第几帧,返回值是图片的绝对路径
func GetSnapshot(videoPath, imageName string, frameNum int) (ImagePath string, err error) {
snapshotPath = "/root/videoImage/" + imageName
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
}
imgPath := snapshotPath + ".png"
return imgPath, nil
}
函数主要用于完善 /douyin/publish/action/ 投稿接口,我们将客户端获取的视频进行保存,然后读出视频的第一帧图片作为封面图片,并保存在服务器主机上,获得视频路径,封面图片路径,将一系列值保存在数据库中
finalName := fmt.Sprintf("%d_%s", user.UserID, filename)
saveFile := filepath.Join("/root/video", finalName)
strArray := strings.Split(finalName, ".")
ImageName := strArray[0]
imagePath, _ := GetSnapshot(saveFile, ImageName, 1)
var video models.Video
video.CoverURL = imagePath
video.PlayURL = saveFile
video.Title = title
video.UserID = user.UserID
models.AddVideo(video)