Noob Gopher 实现一个 ffmpeg 脚本
需求的产生
通常来讲, 老夕手里有数量非常庞大的类似森萝财团这种写真集, 苦于高档单反画质实在是高, 每张恨不得 40M 大, 千兆 NAS 加载一张图需要半天, 严重影响欣赏时的心情, 于是
通常, 我们用一个万金油命令
ffmpeg -i input.jpg output.webp
神奇的 ffmpeg 就会帮我们执行流程, 将图片按照原尺寸, 但是 75% 的质量转换为高压缩比的 WebP 有损图片
对于编码器参数, 性能质量比的测评可以等我把以前写在别处的重新投一遍, 目前最优解基本上就是 WebP, 或者为了更高的兼容性继续使用 JPEG
对于单一文件, 我们可以一行一行敲, 但作为懒狗, 这种时候最好还是用个脚本, 于是老夕用着自学的半吊子 Golang 技术来给大家献个丑
实现
鉴于这个东西已经基本成型了, 没法 Step By Step 讲, 我就倒叙, 大概需要这么几个东西:
- 判断文件夹和文件, 是文件需要处理, 是文件夹需要建立
filepath.WalkDir()
- 判断后缀, 到底哪些是需要转码的图片
map if else / switch case & goto
- 多线程支持, ffmpeg 单核运行, 多开几个完全利用计算资源
goroutine chan
- 错误处理, ffmpeg 炸了你得调查是什么问题导致的好修改参数
if err!=nil{}
还有进阶配置: - cmd 传递目录参数
flag
- 读配置文件指定更多的参数
BurnSushi/toml
- 内嵌配置文件
embed
Go 可能是最为合适的语言, 相比 Shell Script 跨平台支持更好, 类原生编译(编译器生成 Plan9 汇编, Native 上运行 Plan9), 强类型, 这个示例基本上把 single package 开发给练习完了