当前位置:首页 > 能源 > 正文

365倒计时视频怎么做?别慌,我用Go语言帮你把流程跑一遍

  • 能源
  • 2026-08-02 22:57:55
  • 99
摘要: 你是不是也在抖音或者朋友圈刷到过那种“距离高考还有365天”或者“宝贝出生倒计时第100天”的视频?背景音乐一响,数字一天天变,...

你是不是也在抖音或者朋友圈刷到过那种“距离高考还有365天”或者“宝贝出生倒计时第100天”的视频?背景音乐一响,数字一天天变,看着特别有仪式感,很多人以为这得用PR或者AE这种大软件,其实啊,用Go语言写个小脚本,加上FFmpeg,你就能批量生成这种视频,而且还能自动化,每天自动更新,省心得很。

我一开始也犯嘀咕,Go语言不是写后端接口的吗?还能做视频?后来一想,咱不直接“画”视频,咱是“拼”视频,核心思路就三步:生成带数字的图片 → 用FFmpeg把图片和音频合成视频 → 用Cron定时任务每天跑一次,你先别急着写代码,先把这三个环节理解透了,后面写代码就是水到渠成的事。

第一步:别碰视频,先搞定那张“会变的图”

你不需要会用PS,用Go标准库里的imageimage/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)

然后调drawNumbermakeVideo,生成今天的视频,你把编译好的程序扔到服务器上,用Cron设个每天早上8点的定时任务:

0 8 * * * /root/365countdown --target 2026-06-07

这样每天醒来,你邮箱里(接个SMTP通知)或者服务器目录里,就会有一个新的output_366.mp4output_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天”的视频,每天服务器跑完任务,我下载到手机,配上她当天笑的照片,发朋友圈特有感觉,你也试试,说不定坚持一年后,回看第一个视频,你会觉得特别有意思——哪怕它看起来有点愣愣的。

365倒计时视频怎么做?别慌,我用Go语言帮你把流程跑一遍