当前位置:首页 > 房产 > 正文

我的365第一期视频,用Go语言记录平凡日子里的光

  • 房产
  • 2026-07-03 15:56:20
  • 311
摘要: h2: 为什么是“365”?一个关于坚持的笨办法老实说,我写这个系列的时候,压根没想过能坚持多久,一年前,我在GitHub上瞎逛...

h2: 为什么是“365”?一个关于坚持的笨办法

老实说,我写这个系列的时候,压根没想过能坚持多久,一年前,我在GitHub上瞎逛,看到有人用Python写了个“每日一图”的脚本,突然就冒出个念头:要不我也试试?但我这人吧,Python用得不溜,倒是天天跟Go打交道。于是就有了“我的365”——用Go语言写的、每天生成一个视频的小项目。

你可能觉得奇怪,视频跟Go语言有什么关系?嗯……其实视频内容本身是自动生成的,但背后的数据抓取、逻辑处理、定时调度,全是用Go写的,第一期视频是在1月1号凌晨2点生成的,我记得特别清楚,当时外面烟花噼里啪啦响,我盯着终端里一串串日志输出,看着那个几MB的MP4文件慢慢成形——那一刻,这代码突然活了

h2: 第一期视频:从“想太多”到“动手做”

h3: 技术选型:为什么偏偏是Go?

说实话,做视频处理,一般都会想到Python的OpenCV或者FFmpeg的Python封装,但我偏不,原因有三:

  1. 编译成单文件:丢到服务器上就能跑,不用配环境,我租了个小破VPS,系统是Debian,装个Go就完事。
  2. 并发顺手:每天要抓数据、处理模板、渲染视频,Go的goroutine让这几个步骤能串起来跑,还不容易崩。
  3. 就是喜欢:没别的原因,写Go让我觉得踏实。

现在回头看,第一期视频做得真烂。 画面卡顿,字体跑偏,背景音乐跟画面完全对不上拍子,但——它跑起来了,这就是最关键的。

h3: 代码框架:核心逻辑长这样

我简单画了个流程图(想象一下),第一期视频的代码大概分三块:

模块 作用 关键包
数据采集 从公开API拉天气、新闻标题、GitHub趋势仓库 net/http + encoding/json
模板渲染 把数据填入设计好的图片模板 image + golang.org/x/image/font
视频生成 把图片序列合成视频,加上音频 os/exec 调FFmpeg

数据采集那块最折腾,刚开始想抓个本地天气,结果找了个免费API,返回的数据格式三天两头变,后来干脆轮询了三个不同源,哪个能跑用哪个——丑是丑了点,但稳啊

模板渲染更是翻车现场,第一期视频用的字体文件没设置好,中文直接变成方框,那天晚上我盯着屏幕看了十分钟,才反应过来是字体路径写错了。补上字体文件,重新跑一遍,看到文字正常显示的那一刻,我差点喊出来。

h3: 生成流程:一个轻量级的生产线

第一期视频的生成流程,我现在还记得清清楚楚:

  1. 早上6点,cron触发主程序
  2. 抓取当天要显示的数据(比如日期、一句鸡汤、一张随机无版权图片)
  3. 用Go代码绘制一帧帧图片(一共30帧,因为视频只有3秒)
  4. 把所有图片用FFmpeg合成一个无声视频
  5. 再叠加一条背景音乐(自己用Audacity随便录的鸟叫声)
  6. 输出到指定文件夹,顺便发条消息通知我

整个流程大概跑了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语言开始,是那个凌晨最自然的选择。

我的365第一期视频,用Go语言记录平凡日子里的光