项目video代码记录学习 | 青训营笔记

106 阅读2分钟

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

项目video代码记录学习 项目video部分代码通过上传至minio上 首先使用FormFile函数将data字段对应的数据取出存入data变量中

data, err := c.FormFile("data")

调用videoService里的publish函数,将视频对应的用户传入

err = videoService.Publish(data, userId, title, c)

通过data.open的函数方法将返回值存入video变量中 记住需要close不然会内存泄漏

video, err := data.Open()
if err != nil {
   log.Printf("方法data.Open() 失败%v", err)
   return err
}
defer video.Close()

生成视频对应的名称

log.Printf("方法data.Open() 成功")
//生成一个uuid作为视频的名字
//videoName := uuid.NewV4().String()
var videoName strings.Builder
videoName.WriteString(strconv.FormatInt(userId, 10))
videoName.WriteString("_")
videoName.WriteString(strconv.FormatInt(util.GetCurrentTimeMillisecond(), 10))
videoName.WriteString(".mp4")
log.Printf("生成视频名称%v", videoName)

设置视频暂存的路径videopath 以及视频的桶名称

videoPath := "/tmp/file/video/" + videoName.String()
videoBucketName := config.Config.Minio.VideoBuckets

调用repository中的FileMinio函数 并将对应参数填入

err = repository.FileMinio(videoBucketName, videoName.String(), videoPath, "mp4")
if err != nil {
   log.Printf("方法repository.VideoMinio(video, videoName.String(), videoSize)%v", err)
   return err
}
log.Printf("repository.VideoMinio(video, videoName.String(), videoSize)成功")

将视频存入对应的文件夹之中,并且获得地址

if err := c.SaveUploadedFile(data, "/tmp/file/video/"+videoName.String()); err != nil {
   log.Printf("上传到临时地址%v", err)
   return err
}

通过getimgefile函数获取视频第一帧 并判断是否获得成功

picName, err := GetImageFile(videoPath)
if err != nil {
   log.Printf("获取视频第一帧失败%v", err)
   return err
}
log.Printf("获取视频第一帧成功%v", picName)

获得图片对应的存储路径以及图片的minio桶名称

picPath := "/tmp/file/pic/" + picName

// TODO 在服务器上执行ffmpeg 从视频流中获取第一帧截图,并将图片上传到minio上
pictureBucketName := config.Config.Minio.PicBuckets

再次调用fileminio的函数填入参数,将截图的图片存入minio之中

err = repository.FileMinio(pictureBucketName, picName, picPath, "jpg")
if err != nil {
   log.Printf("方法repository.VideoMinio(image, pictureName.String(), pictureBucketName, videoSize) 失败%v", err)
   return err
}

fileminio函数主要调用了UploadLocalFile函数 函数最主要使用了minio的FPutObject具体如下

ctx := context.Background()
info, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{
   ContentType: contentType,
})

getimage函数最主要调用了ffmpeg这个工具具体如下

cmd := exec.Command("ffmpeg", "-i", videoPath, "-ss", "1", "-f", "image2", "-t", "0.01", "-y", picName)
err := cmd.Run()