用Go语言写一个在一起365纪念日视频生成器,把代码写成情书

你可能和我一样,在纪念日前两天才突然想起来——啊!明天就是一周年了!手忙脚乱翻手机相册,发现照片堆成山,视频散落在各个文件夹里,想拼个...

你可能和我一样,在纪念日前两天才突然想起来——啊!明天就是一周年了! 手忙脚乱翻手机相册,发现照片堆成山,视频散落在各个文件夹里,想拼个纪念视频,却连剪映都不想打开,这时候我就在想:能不能用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语言写一个在一起365纪念日视频生成器,把代码写成情书

go run main.go --config memories.json

然后去倒了杯咖啡,回来就看到一个叫 final_365.mp4 的文件躺在桌面上,点开播放,第一秒是我们第一次见面的地方,最后一秒是昨天的晚餐——中间这365天,居然真的被代码串起来了。

最后想说的是:技术有时候挺冷的,但当它被用来记录“在一起”这件事的时候,好像就暖了,你可以模仿这个思路,也可以直接用现成的库,甚至可以直接复制我的代码改改,重要的是——你自己动手做的那份心意,是任何算法都替代不了的。

视频生成完的那天晚上,她看完沉默了很久,然后说:“你这个程序员,还挺浪漫的。”

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/nengyuan/973.html

(3)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-01

    我是be365的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-01

    希望本篇文章《用Go语言写一个在一起365纪念日视频生成器,把代码写成情书》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-01

    本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名

  • kyadmin
    kyadmin 2026-07-01

    本文概览:你可能和我一样,在纪念日前两天才突然想起来——啊!明天就是一周年了!手忙脚乱翻手机相册,发现照片堆成山,视频散落在各个文件夹里,想拼个...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们