你有没有想过,如果每天拍一张照片,一年后把这些照片串成一段视频,会是什么样子?这事儿我去年真干了,不是用手机App,不是用现成的模板,而是自己写了个Golang程序来干,别急着觉得这很技术宅,其实这事儿比你想的简单,也比你想的有意思。
为什么非得用Golang?
我一开始也试过Python,毕竟它库多嘛,但处理几百张高清照片时,那个速度……嗯,够我泡杯咖啡再喝完,Golang不一样,它编译成原生代码,处理图像的速度快得离谱,而且最爽的是,它把并发这事儿变得特别自然,你根本不需要去折腾什么线程池。
说个真实的感受:当你看到程序在几秒内处理完一年的照片,那种感觉就像你发现自己家的猫其实会开门一样——惊喜又有点不真实。
从零开始:你需要什么
其实就三样东西:
- 365张照片(视频片段也行,后面细说)
- Golang开发环境(这个装一下五分钟)
- 一个叫ffmpeg的工具(它处理视频合并)
我去年用的照片全是手机拍的,有清晨六点的日出,有加班到凌晨的办公室,有路边偶遇的流浪猫,还有失败的可乐鸡翅。没什么构图讲究,也没什么光影技巧,就是最真实的日常。
第一步:给照片排好队
你别指望照片文件名是IMG_001.jpg这种好东西,实际拍出来的照片,文件名可能是这样的:2024-03-15-晚上-火锅.jpg或者IMG_20240315_193045.jpg,Golang处理这个就太舒服了:
// 这其实是我去年写的代码简化版
files, _ := filepath.Glob("./photos/*.jpg")
sort.Strings(files)
注意一个坑:文件名排序不是你想的那么简单,特别是当照片跨月、跨年的时候,按字符串排序会出问题,我去年就栽过这个跟头,十二月的照片跑到一月前面去了,后来老老实实用 time.Parse 解析拍摄时间,按时间戳排序。
第二步:统一尺寸,不然视频看着像马赛克
这个步骤最容易被人忽视,365张照片,有的横着拍,有的竖着拍,有的4K高清,有的是微信压缩过的。不统一尺寸直接合成,你会得到一个让人头晕的视频。
Golang的image包配合golang.org/x/image/draw库,处理这个很顺手,我一般统一缩放到1920x1080,这样竖拍的照片上下会有黑边,但至少画面不扭曲。
这里有个小技巧:缩放算法选draw.ApproximatingBiLinear就行,不是最清晰但速度最快,处理365张照片,总共不到两秒,你要是用draw.CatmullRom这种高质量算法,效果是好,但时间要翻几倍,对于这种“日常记录”项目,没必要追求极致画质。
第三步:合成视频,这才是重头戏
把365张图片合成视频,说白了就是图片转视频再拼接,我用的是ffmpeg,但用Golang的os/exec包来调用它,这样整个流程可以自动化。
具体参数我调试了好多次,最后觉得这个组合最舒服:
| 参数 | 值 | 说明 |
|---|---|---|
| -framerate | 12 | 每秒12张,节奏舒缓但不拖沓 |
| -c:v | libx264 | 通用格式,哪儿都能播 |
| -pix_fmt | yuv420p | 兼容性好 |
| -r | 12 | 输出帧率保持一致 |
一个视频30秒左右,正好配一首歌。12帧每秒是个神奇的数字,太快了看不清每一张照片,太慢了又显得拖沓。
可选:让视频“活”起来
单纯的照片切换太死板了,我后来加了两个效果:
- Ken Burns效果——就是那种照片慢慢放大或平移的效果,纪录片里常用
- 交叉淡入淡出——两张照片之间不是直接切换,而是渐变的
Golang里实现这些需要逐帧处理,计算量确实大。60秒的视频,12fps,那就是720帧,每一帧都要重新渲染,我处理365张照片加上Ken Burns效果,程序跑了大概4分钟,不过看着最终效果,值了。
值得试试的“边角料”思路
写着写着,发现几个让这个项目更好玩的方向:
- 不只是照片,也混入短视频片段,比如某天你拍了个精彩的10秒视频,可以把它插在照片序列里
- 按季节给视频调色,春天偏绿,秋天偏暖,用Golang调整每个月的照片色调
- 在视频上叠加时间戳,每一张照片左下角显示拍摄日期,这样看的时候能清楚地感受到时间的流逝
一个真实的对比:Golang vs 手机App
有人问我,手机上一堆App都能做这个,干嘛自己写程序?
那些App确实方便,但有几个问题:
- 隐私问题——你的所有照片要上传到他们的服务器
- 定制空间有限——只能选他们提供的模板
- 有些还收费——一个模板要几十块
自己写有这些好处:

- 所有照片都在本地处理,不用担心隐私
- 你可以控制每一帧的细节,想加什么特效都行
- 免费且可重复使用,明年这时候再跑一次就行
唯一的门槛就是得花一两小时写代码,但你一旦写好了,以后每年拍365张照片,跑一下程序,就能得到属于你的年度记忆视频。
意外的收获
去年12月31日晚上,我坐在电脑前,按下了那个“开始合成”的按钮,程序运行了大概三分钟,生成了一个1.2GB的视频文件。
播放的时候,看到三月份吃火锅时冒着的热气,看到六月份暴雨中没带伞的自己,看到九月份地铁上邻座小孩对我做鬼脸——那些照片就像一个个锚点,把快要被遗忘的点滴都拉了回来。
我老婆在旁边看,突然说:“诶,这张照片我记得,那天你做饭把酱油倒多了。”我们俩笑成一团,这东西,技术含量不高,但它用最笨拙的方式记录了最真实的生活。
用Golang写这个,不是为了炫技,而是为了让这个过程可控、可重复、可定制,如果你会一点编程,真的可以试试,如果你不会,花一个周末学学Golang基础,然后完成这个项目,会是你学编程过程中最有成就感的一件事之一。
365张照片,30秒的视频,一年的日子就这样被压缩、打包、存档,明年这时候,你会感谢今天开始动手的自己。
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/keji/1782.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《一年365张照片视频,用Golang记录时间的另一种可能》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:你有没有想过,如果每天拍一张照片,一年后把这些照片串成一段视频,会是什么样子?这事儿我去年真干了,不是用手机App,不是用现成的模板,而...