我的365第一期视频,用Go语言记录平凡日子里的光
- 房产
- 2026-07-03 15:56:20
- 311
h2: 为什么是“365”?一个关于坚持的笨办法
老实说,我写这个系列的时候,压根没想过能坚持多久,一年前,我在GitHub上瞎逛,看到有人用Python写了个“每日一图”的脚本,突然就冒出个念头:要不我也试试?但我这人吧,Python用得不溜,倒是天天跟Go打交道。于是就有了“我的365”——用Go语言写的、每天生成一个视频的小项目。
你可能觉得奇怪,视频跟Go语言有什么关系?嗯……其实视频内容本身是自动生成的,但背后的数据抓取、逻辑处理、定时调度,全是用Go写的,第一期视频是在1月1号凌晨2点生成的,我记得特别清楚,当时外面烟花噼里啪啦响,我盯着终端里一串串日志输出,看着那个几MB的MP4文件慢慢成形——那一刻,这代码突然活了。
h2: 第一期视频:从“想太多”到“动手做”
h3: 技术选型:为什么偏偏是Go?
说实话,做视频处理,一般都会想到Python的OpenCV或者FFmpeg的Python封装,但我偏不,原因有三:
- 编译成单文件:丢到服务器上就能跑,不用配环境,我租了个小破VPS,系统是Debian,装个Go就完事。
- 并发顺手:每天要抓数据、处理模板、渲染视频,Go的goroutine让这几个步骤能串起来跑,还不容易崩。
- 就是喜欢:没别的原因,写Go让我觉得踏实。
现在回头看,第一期视频做得真烂。 画面卡顿,字体跑偏,背景音乐跟画面完全对不上拍子,但——它跑起来了,这就是最关键的。
h3: 代码框架:核心逻辑长这样
我简单画了个流程图(想象一下),第一期视频的代码大概分三块:
| 模块 | 作用 | 关键包 |
|---|---|---|
| 数据采集 | 从公开API拉天气、新闻标题、GitHub趋势仓库 | net/http + encoding/json |
| 模板渲染 | 把数据填入设计好的图片模板 | image + golang.org/x/image/font |
| 视频生成 | 把图片序列合成视频,加上音频 | os/exec 调FFmpeg |
数据采集那块最折腾,刚开始想抓个本地天气,结果找了个免费API,返回的数据格式三天两头变,后来干脆轮询了三个不同源,哪个能跑用哪个——丑是丑了点,但稳啊。
模板渲染更是翻车现场,第一期视频用的字体文件没设置好,中文直接变成方框,那天晚上我盯着屏幕看了十分钟,才反应过来是字体路径写错了。补上字体文件,重新跑一遍,看到文字正常显示的那一刻,我差点喊出来。
h3: 生成流程:一个轻量级的生产线
第一期视频的生成流程,我现在还记得清清楚楚:
- 早上6点,cron触发主程序
- 抓取当天要显示的数据(比如日期、一句鸡汤、一张随机无版权图片)
- 用Go代码绘制一帧帧图片(一共30帧,因为视频只有3秒)
- 把所有图片用FFmpeg合成一个无声视频
- 再叠加一条背景音乐(自己用Audacity随便录的鸟叫声)
- 输出到指定文件夹,顺便发条消息通知我
整个流程大概跑了2分17秒。日志里最后一行写着:“第一期视频已生成,文件大小:4.7MB”。 我看着那个数字,感觉自己好像干了件挺了不起的事。
h2: 为什么这件事值得被记住?
你可能会想:不就是个自动生成的破视频吗?有什么好写的?嗯……我一开始也这么觉得,但后来我发现,真正重要的不是视频本身,而是用代码“锚定”住时间这种感觉。
365天,每天一个视频,虽然内容可能很无聊——今日天气:晴,气温24℃,出门记得带伞”——但当你回头看第一天那个画质渣到爆、文字还对不齐的视频时,心里会泛起一种奇怪的的感触:哦,那一天我是这么开始的。
用Go写这件事,让我对这门语言有了完全不同的理解,平时写业务代码,总觉得Go就是“高效的CRUD工具”,但当我用它去操作图片、调用FFmpeg、处理定时任务时,才意识到:Go的简约,恰好能让这种小工具保持住原汁原味的控制感,没有花哨的框架,不用考虑复杂的设计模式,就是一个main函数,一堆标准库,外加一点shell调用——够了。
h2: 一些翻车经验(你可能用得上)
写“我的365”第一期视频的时候,我踩了大概七八个坑,说几个大的:
- 字体问题:Go的
freetype库渲染中文时,字体文件必须提前加载,我一开始用绝对路径,部署到服务器就炸了,后来改成内嵌字体文件到二进制,用embed包搞定。 - 图片尺寸:第一期没注意图片宽高比,结果生成出来的视频被拉伸成奇怪比例,人脸都变长了,后来强制设定为1920×1080,每个素材都先做resize。
- 定时精度:cron设置成“每天0点执行”,结果由于数据更新时间差,有时候会生成昨天甚至前天的内容,解决办法是在代码里加个时间校验,强行截到当天的00:00:00。
这些坑当时觉得特别烦,现在回头看,反而成了最鲜活的记忆点。 如果你也想搞类似的项目,建议先拿手边最趁手的语言开搞,用Go也好,用Python也罢,关键是先跑通第一个版本,丑没关系,卡顿没关系,甚至内容空荡也没关系——第一期视频就是用来“存在”的,不是用来“完美”的。
h2: 就自然而然继续了
现在我的电脑里还存着那个第一期视频的文件,每次翻到它,都能想起那个凌晨——键盘声、屏幕微弱的光、还有终端里滚动的日志。它不完美,但它很真实,就像用Go写的每一行代码,朴实、直接、偶尔报错,但总能跑出点东西来。
第一期视频生成后,我发了条朋友圈,就写了一句:“我的365,第1天。” 底下一堆人问:“365是个啥?” 我说:“就一个小项目。” 没多说,因为当时我也说不清楚它能变成啥样。
但至少,它开始了,而开始,往往是整个事情里最难的那一步,用Go语言开始,是那个凌晨最自然的选择。
