你可能和我一样,在纪念日前两天才突然想起来——啊!明天就是一周年了! 手忙脚乱翻手机相册,发现照片堆成山,视频散落在各个文件夹里,想拼个纪念视频,却连剪映都不想打开,这时候我就在想:能不能用Go语言写个小工具,一键生成那种带时间轴、带文字、带背景音乐的“在一起365纪念日视频”?
为什么是Go,不是Python或者别的?
说实话,一开始我也想过Python,但后来发现Go有几个特别实在的好处:
- 编译成单个二进制文件:你写好之后,发给女朋友或者发到朋友圈,别人不需要装任何依赖,双击就能跑
- 并发处理视频帧:Go的goroutine用来处理视频切片、拼接、转码特别顺手
- 跨平台:Windows、Mac、Linux都能跑,不用操心环境问题
最开始我写这个程序的时候,其实是奔着“能用就行”去的,没想到后来改着改着,居然真的像模像样了。
第一步:整理素材——我们得知道“在一起365天”里都经历了什么
type Memory struct {
Date string string
PhotoPath string
VideoPath string
Note string
}
这个结构体就是整个视频的灵魂,你需要手动填进去365天里那些重要的时刻:第一次旅行、一起搬家、深夜吃火锅、吵架又和好……我写的时候把照片按照“月份”分了组,然后写一个简单的CSV读取器,把数据灌进去。
如果你不想写代码,其实可以跳过这一步,直接找一个现成的视频剪辑软件,但如果你和我一样,想用“代码”表达心意——那继续往下看。
第二步:生成视频帧——把每一天变成一张带文字的卡片
这里我用的是 github.com/fogleman/gg 这个库,它可以非常方便地在图片上画文字、画日期、画渐变色。
func DrawDayCard(m Memory, outputPath string) error {
dc := gg.NewContext(1920, 1080)
// 设置背景色——这里我用了暖色调,像日落
dc.SetRGBA(1, 0.85, 0.7, 1)
dc.Clear()
// 写上日期
dc.SetRGB(0, 0, 0)
dc.DrawStringAnchored(m.Date, 960, 200, 0.5, 0.5)
// 写下那天的回忆
dc.DrawStringWrapped(m.Note, 960, 500, 0.5, 0.5, 800, 1.5, gg.AlignCenter)
return dc.SavePNG(outputPath)
}
这个过程其实很治愈,每生成一张卡片,就等于重新回忆了一遍那一天,我写的时候发现,很多照片自己都忘了是哪天拍的,翻聊天记录才想起来——哦,那天是第一次去她家。
第三步:拼接视频——用FFmpeg做“幕后英雄”
Go本身不处理视频,但可以调用FFmpeg,我们用 os/exec 包把生成的图片按顺序拼成视频。
cmd := exec.Command("ffmpeg",
"-r", "30", // 帧率
"-i", "frames/frame_%04d.png",
"-c:v", "libx264",
"-pix_fmt", "yuv420p",
"output.mp4",
)
err := cmd.Run()
这里有个坑:如果你直接拼接300多张图片,视频会特别长,所以我做了个加速处理——把每天的卡片只显示0.5秒,这样365天卡片的视频时长大概在3分钟左右,配上音乐刚刚好。
第四步:加背景音乐——选一首对你们有意义的歌
把音乐加进去,我是直接在FFmpeg命令里加参数:
cmd := exec.Command("ffmpeg",
"-i", "output_noaudio.mp4",
"-i", "music.mp3",
"-c:v", "copy",
"-c:a", "aac",
"-shortest",
"final_365.mp4",
)
挑歌的时候我纠结了很久,后来选了第一次约会时咖啡店里放的那首,虽然歌很老,但那个味道对。
在一起365纪念日视频”的一些小心思
| 组件 | 我用的库/工具 | 备注 |
|---|---|---|
| 图片处理 | gg (fogleman/gg) |
画文字、画渐变 |
| 视频拼接 | FFmpeg | 必须装系统里 |
| 配置文件 | JSON / YAML | 存储日期、文字、路径 |
| 进度条 | cheggaaa/pb |
生成时显示进度 |
如果你也想做一个属于自己的纪念视频,我建议不要追求“完美”,那个视频里我有一帧拼错了日期,把第200天写成了第2000天,女朋友看到笑疯了——不完美反而成了最真实的回忆。
运行起来
写好之后,我在命令行里输入:

go run main.go --config memories.json
然后去倒了杯咖啡,回来就看到一个叫 final_365.mp4 的文件躺在桌面上,点开播放,第一秒是我们第一次见面的地方,最后一秒是昨天的晚餐——中间这365天,居然真的被代码串起来了。
最后想说的是:技术有时候挺冷的,但当它被用来记录“在一起”这件事的时候,好像就暖了,你可以模仿这个思路,也可以直接用现成的库,甚至可以直接复制我的代码改改,重要的是——你自己动手做的那份心意,是任何算法都替代不了的。
视频生成完的那天晚上,她看完沉默了很久,然后说:“你这个程序员,还挺浪漫的。”
本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/nengyuan/973.html
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《用Go语言写一个在一起365纪念日视频生成器,把代码写成情书》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:你可能和我一样,在纪念日前两天才突然想起来——啊!明天就是一周年了!手忙脚乱翻手机相册,发现照片堆成山,视频散落在各个文件夹里,想拼个...