365倒计时视频怎么做?别慌,我用Go语言帮你把流程跑一遍
- 能源
- 2026-08-02 22:57:55
- 69
你是不是也在抖音或者朋友圈刷到过那种“距离高考还有365天”或者“宝贝出生倒计时第100天”的视频?背景音乐一响,数字一天天变,看着特别有仪式感,很多人以为这得用PR或者AE这种大软件,其实啊,用Go语言写个小脚本,加上FFmpeg,你就能批量生成这种视频,而且还能自动化,每天自动更新,省心得很。
我一开始也犯嘀咕,Go语言不是写后端接口的吗?还能做视频?后来一想,咱不直接“画”视频,咱是“拼”视频,核心思路就三步:生成带数字的图片 → 用FFmpeg把图片和音频合成视频 → 用Cron定时任务每天跑一次,你先别急着写代码,先把这三个环节理解透了,后面写代码就是水到渠成的事。
第一步:别碰视频,先搞定那张“会变的图”
你不需要会用PS,用Go标准库里的image和image/draw,咱自己画,你要做的就是在纯色背景上,把“365”这个数字用大号字体画上去。
这里有个坑得提醒你:Go标准库不带字体文件,你得自己准备一个.ttf字体文件,比如常用的思源黑体或者Arial Black,我当初就卡在这,画出来的字全是方框,后来用github.com/golang/freetype这个库加载字体才解决。
大致代码逻辑是这样(你感受下节奏):
func drawNumber(filename string, days int) {
// 创建一个 1080x1920 的RGBA画布(竖屏短视频)
img := image.NewRGBA(image.Rect(0, 0, 1080, 1920))
// 填充背景色(比如温柔的米色)
draw.Draw(img, img.Bounds(), &image.Uniform{C: color.RGBA{R: 250, G: 248, B: 240, A: 255}}, image.Point{}, draw.Src)
// 用freetype加载字体,设置大小比如150磅
// 把 "距离XX还有" 写在上面,把 days 变量转成字符串写在正中间
// 保存为 day_365.png
}
别小看这一步,排版要留白,数字别顶到屏幕边缘,上半部分留点位置放“励志语录”,下半部分放个进度条(用draw.Fill画个矩形就行),我每次生成完都会用os.Open打开看一眼,确认像素位置对不对。
第二步:FFmpeg是幕后功臣,Go只负责指挥
图片生成好了,剩下就是“连幻灯片都算不上”的简单操作,因为倒计时视频本质上就是一张静态图 + 一段背景音乐 + 几秒固定时长,不需要任何转场特效。
你只要在Go里调用exec.Command执行FFmpeg命令,
ffmpeg -loop 1 -i day_365.png -i bgm.mp3 -c:v libx264 -t 5 -pix_fmt yuv420p -c:a aac output_365.mp4
我解释下这几个参数,不然你肯定懵:-loop 1让图片循环播放,-t 5是视频时长5秒(刚好配一段舒缓钢琴曲的前奏),-c:v libx264是H.264编码(上传抖音不会压缩模糊)。重点在-pix_fmt yuv420p,不加这个,有些手机播放器会显示绿屏,我踩过这坑,修了一晚上才发现是像素格式不兼容。
Go这边代码长得像这样:
func makeVideo(pngPath, mp3Path, outPath string) error {
cmd := exec.Command("ffmpeg", "-loop", "1", "-i", pngPath, "-i", mp3Path,
"-c:v", "libx264", "-t", "5", "-pix_fmt", "yuv420p", "-c:a", "aac", outPath)
return cmd.Run()
}
注意:你得提前在系统里装好FFmpeg,并且确保ffmpeg命令在PATH环境变量里,Windows用户记得用ffmpeg.exe完整路径,别问我怎么知道的。
第三步:让视频“活”起来,每天自动减1
这步才是灵魂,你写个main.go,里面算一下目标日期和今天的差:
daysLeft := int(time.Until(targetDate).Hours() / 24)
然后调drawNumber和makeVideo,生成今天的视频,你把编译好的程序扔到服务器上,用Cron设个每天早上8点的定时任务:
0 8 * * * /root/365countdown --target 2026-06-07
这样每天醒来,你邮箱里(接个SMTP通知)或者服务器目录里,就会有一个新的output_366.mp4、output_365.mp4……你会发现文件名本身就是倒计时。
进阶玩法:批量生成全年视频
你要是想偷懒,一次把365个视频全生成出来,然后每天定时发布,那也简单,在Go里加个循环:
for i := 365; i >= 1; i-- {
drawNumber(fmt.Sprintf("day_%d.png", i), i)
makeVideo(fmt.Sprintf("day_%d.png", i), "bgm.mp3", fmt.Sprintf("final_%d.mp4", i))
}
但因为要编码365次,*建议加个`time.Sleep(1 time.Second)`**,不然CPU直接拉满,服务器容易宕机,我当年就是这么干的,结果VPS厂商发来警告邮件。
有一点我得坦白
这方法做出来的视频没有复杂动画,就是数字变一下,背景色都不变,跟那种用AE做粒子消散效果的没法比,但好处是啥?稳、快、省心,你不需要学视频剪辑,不需要手动导出,一切交给代码,而且对于“365天每日打卡”这种场景,用户看的不是特效,是坚持和那个跳动的数字。
如果你想要点动态效果,比如数字淡入淡出,那得用Go的gocv库(OpenCV绑定)或者干脆换Python的moviepy,但咱Go选手讲究的就是“够用就行”,对吧?
我到现在还用着这套流程,给闺女做“距离上小学还有100天”的视频,每天服务器跑完任务,我下载到手机,配上她当天笑的照片,发朋友圈特有感觉,你也试试,说不定坚持一年后,回看第一个视频,你会觉得特别有意思——哪怕它看起来有点愣愣的。
