介绍
本人最近在写抖音demo视频流逻辑的时候遇到了以下问题:
1.使用localhost无法访问访问上传到public端口的视频
2.视频上传后,播放加载不出来,播放卡顿
首先第一个问题
由于代码运行的时候是给前端提供接口,视频链接的localhost就是指app端了,所以无法正确读取到,需要使用服务器本身的ip地址,打开CMD,输入ipconfig ,回车后,ipv4里就是服务器本机的地址了。
gin注册路由的时候开放静态资源目录,便可以在地址栏访问到相应的文件了:
r := gin.Default()
r.Static("/static", "./public")
r.Static("/img", "./img")
分别在服务器ip :端口/static/ 和 服务器ip :端口/img/可以访问到public和ing下的文件
视频解码FFmpeg
由于视频格式有固定要求吗,一般在网页上播放的视频都是要求MP4,H264解码,ACC音频格式的,如果其他的解码方式或者不是MP4就会造成无法播放或解析慢无法卡顿的情况,所以我们需要使用FFmpeg对视频进行转码操作。
FFmpeg下载:
https://ffmpeg.org/download.html#build-windows
选择对应的包下载,然后解压放到硬盘根目录,进入到bin目录复制路径注册到系统变量path中。
在go中用os包使用cmd命令对传入的视频进行转码操作,bin中的ffmpeg.exe是可以拿出来的,放到项目中通过相对位置调用。
下面的代码思路是将视频转码改名输出在同一个文件夹,然后删除转码前的文件再将转码后的文件重命名回来
publish.go
// FFmpeg转码操作...
func transcodeVideo(finalName string) {
//视频转码压缩
cmd := exec.Command("ffmpeg", "-i", "public/"+finalName, "-c:v","libx264", "-crf" ,"23" ,"-preset" ,"medium", "-c:a" ,"aac", "-b:a", "128k" ,"public/"+"new"+finalName)
err := cmd.Run() //运行
if err != nil {
fmt.Println(err)
}
os.Remove("public/"+finalName) //移除原文件
err = os.Rename("public/"+"new"+finalName,"public/"+finalName) //重命名转码文件
if err != nil {
fmt.Println("Error renaming file:", err)
return
}
}
需要注意的是,以上命令的相对位置以mian.go为准
由于如果在上传的过程中直接将转码步骤放入上传过程的函数中会有可能因为转译的文件过大,时间久而导致返回错误信息,所以通过异步操作来传入的视频进行转码操作。
//视频转码压缩
go transcodeVideo(finalName) //异步操作防止程序返回错误
视频截图生成封面
使用FFmpeg截取视频的第一秒第一帧的图片保存在img中,开放img静态目录。
// FFmpeg命令截图
cmd := exec.Command("FFmpeg/ffmpeg.exe", "-i", "public/"+finalName, "-ss", "1", "-vframes", "1", "img/"+finalName+".jpg")
err = cmd.Run() //运行
if err != nil {
fmt.Println(err)
}
这就是今天所解决的一些问题和麻烦了。