记录大项目过程中踩到的一些坑。
抖音大项目中存储用户上传的视频时,需要存储一个视频封面到本地和数据库。但是前端传回的数据并没有提供视频封面,因此我们需要手动实现从视频中抽帧形成封面的过程。
根据多次踩坑,发现使用ffmpeg实现视频抽帧还是最简单的解决方案。
1 下载ffmpeg
1.1 Linux下载
ffmpeg通常已经包含在了各个发行版的软件源中,只需要通过命令行安装,以Ubuntu为例:
sudo apt install ffmpeg
1.2 Windows下载
windows需要手动下载ffmpeg的编译文件,官方下载地址点击这里。
我选择下载的是ffmpeg-release-full.7z
文件。
解压后,需要将ffmpeg.exe
所在的bin
文件夹添加到系统环境变量。
在系统搜索框搜索编辑系统环境变量
后,依次进行如下操作:
。
2 ffmpeg基本使用
ffmpeg可以用于处理音频、视频和图像。它可以在命令行中使用,提供了各种各样的选项和参数,用于执行各种多媒体处理任务。
格式转换:
ffmpeg -i input.mp4 output.avi
这将把一个名为 input.mp4
的视频文件转换成 output.avi
格式。
调整视频尺寸:
ffmpeg -i input.mp4 -vf scale=640:480 output.mp4
这会将视频的尺寸调整为 640x480 像素。
剪切视频:
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:30 -c:v copy -c:a copy output.mp4
这会从输入视频中剪切出从 1 分钟到 2 分钟 30 秒的片段。
提取音频:
ffmpeg -i input.mp4 -vn output.mp3
这将从视频文件中提取音频,并将其保存为 output.mp3
。
合并多个视频文件:
ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex "concat=n=2:v=1:a=1" output.mp4
这会将 input1.mp4
和 input2.mp4
两个视频文件合并为一个。
添加水印:
ffmpeg -i input.mp4 -i watermark.png -filter_complex "overlay=W-w-10:H-h-10" output.mp4
这会在视频右下角添加一个水印。
转换音频格式:
ffmpeg -i input.wav output.mp3
这会将一个 WAV 格式的音频文件转换为 MP3 格式。
提取视频截图:
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 screenshot.png
这会在视频的第 5 秒提取一帧作为截图。这也是本次大项目中需要使用ffmpeg的地方。
3 利用ffmpeg实现视频封面提取
go语言的标准库os/exec提供了调用本地可执行文件的功能,先贴出代码:
func ExtractCover(v_path string, savePath string) {
// 构建 ffmpeg 命令
cmd := exec.Command("ffmpeg", "-i", v_path, "-ss", "00:00:01", "-vframes", "1", savePath)
// 执行命令并捕获输出
output, err := cmd.CombinedOutput()
if err != nil {
fmt.Println("Error running ffmpeg command:", err)
fmt.Println("Output:", string(output))
return
}
fmt.Println("Image extracted and saved successfully!")
}
这段代码目的是提取指定路径视频文件的第一秒开始提取一帧并进行存储。首先通过exec.Command
构建一个命令行执行命令,ffmpeg
为调用的可执行文件名,"-i", v_path, "-ss"
等都是传入的参数。再通过cmd.CombinedOutput()
执行命令并获取输出。
4 注意事项
可以看到,利用ffmpeg实现视频封面提取非常简单,但使用时仍然有一些注意事项。
- 考虑将该函数设置为异步调用
因为exec.Command
和 CombinedOutput
都涉及到操作系统的进程创建和管理,因此在一些情况下可能会带来一定的开销。考虑视频上传后需要快速地返回到客户端,因此可以考虑将该函数设置为异步调用,即预先设置好图片存储路径和名称,将其先插入到数据库记录中,再进行抽帧操作。
- 错误处理
如果ffmpeg
抽帧失败,可以考虑将一个默认的图片,例如抖音的logo设置为该视频的封面图。