这是我参与「第五届青训营 」伴学笔记创作活动的第 17 天
videoAPK端不能播放问题的解决过程 在本次青训营中,我需要使用使用ffmpeg进行视频流的处理和学习 在本次青训营项目中,由于需要有视频上传功能的投稿接口,之后通过学习别人的方式决定将前端发送过来的视频流直接转送到云存储 MinIO 中,通过获得url链接对该存储对象直接操作截取视频并将输出视频封面同样转存到云存储 MinIO 中。 但是在测试过程中出现一些问题,文章记录了我出现的问题和思考解决的方法。 这个函数作用是将视频和截图的地址记录插入到mysql数据库中videourl是视频地址,pictureurl是截图地址
func Save(videoURL string, pictureURL string, userId int64, title string) error {
var video TableVideo
video.PublishTime = time.Now()
video.PlayUrl = videoURL
video.CoverUrl = pictureURL
video.AuthorId = userId
video.Title = title
result := DB.Save(&video)
if result.Error != nil {
return result.Error
}
return nil
数据库插入出现错误,报错信息为插入数据过长,导致插入失败,思考原因是因为在getfileurl函数中调用minio的PresignedGetObject函数返回的videourl和pictureurl是带有加密地址,因此超过限制长度,所以导致错误
func GetFileUrl(bucketName string, fileName string, expires time.Duration) (*url.URL, error) {
ctx := context.Background()
reqParams := make(url.Values)
if expires <= 0 {
expires = time.Second * 60 * 60 * 24
}
presignedUrl, err := minioClient.PresignedGetObject(ctx, bucketName, fileName, expires, reqParams)
if err != nil {
log.Printf("get url of file %s from bucket %s failed, %s", fileName, bucketName, err)
return nil, err
}
return presignedUrl, nil
解决方法为使用另一个指针指向videourl和pictureplayurl并将带有加密信息的RawQuery设置为空,以此解决数据过长的问题发生
videoplayURL := videoURL
videoplayURL.RawQuery = ""
pictureplayURL := pictureURL
pictureplayURL.RawQuery = ""
err = repository.Save(videoURL.String(), pictureURL.String(), userId, title)
设置完成之后video的url应该如下所示
http://127.0.0.1:9000/video/2_1676647371965.mp4
这次问题解决主要是依靠指针,注意两个指针只要指向相同地址修改一个等于都修改完成