用Go语言搞定PR视频,手写一个365天倒计时生成器

先别急着搜“pr怎么做一个365天倒计时视频”——我们换条路:用Go语言直接生成视频帧。你可能觉得这跟PR有什么关系?其实PR是剪辑...

先别急着搜“pr怎么做一个365天倒计时视频”——我们换条路:用Go语言直接生成视频帧

你可能觉得这跟PR有什么关系?其实PR是剪辑,但如果你会写Go代码,就能自动生成带倒计时的视频素材,然后拖进PR里用,而且这个方法可定制、可批量、不需要手动一帧帧调

我自己试过几轮,踩了不少坑,今天把最实用的写法分享出来。

核心思路:用Go生成视频帧

PR做倒计时视频,一般是新建文本图层,手动改数字,但365天太长,手动改不现实,所以思路是:用Go逐帧生成图片,再拼成视频

需要的工具:

  • Go标准库 imageimage/color
  • golang.org/x/image/font 处理文字
  • ffmpeg(用来把图片序列合成视频)

环境准备:不用谢,就是这些

工具 用途 获取方式
Go 1.20+ 写生成代码 官网下载
FFmpeg 图片→视频 命令行安装
字体文件 显示数字 从系统字体目录拷一个

安装小提示:FFmpeg在Mac用 brew install ffmpeg,Windows下载exe加到PATH就行。

代码实现:一行行手写

我不会直接甩一大段代码吓你,咱们拆开讲

1 创建画布和字体

package main
import (
    "image"
    "image/color"
    "image/draw"
    "image/png"
    "os"
    "golang.org/x/image/font"
    "golang.org/x/image/font/basicfont"
    "golang.org/x/image/math/fixed"
)

注意basicfont 是内置字体,但显示倒计时数字有点小,你可以改成 github.com/golang/freetype 加载本地字体文件。

2 生成单帧图片

每一帧就是一张800x600的白色背景,上面写“距离目标还有 X 天”。

func generateFrame(day int, filename string) {
    width := 800
    height := 600
    img := image.NewRGBA(image.Rect(0, 0, width, height))
    // 背景填白色
    draw.Draw(img, img.Bounds(), &image.Uniform{color.White}, image.Point{}, draw.Src)
    // 写数字
    text := fmt.Sprintf("%d 天", day)
    point := fixed.Point26_6{
        X: fixed.Int26_6(200 * 64), // 粗略居中
        Y: fixed.Int26_6(300 * 64),
    }
    d := &font.Drawer{
        Dst:  img,
        Src:  image.NewUniform(color.Black),
        Face: basicfont.Face7x13,
        Dot:  point,
    }
    d.DrawString(text)
    f, _ := os.Create(filename)
    png.Encode(f, img)
    f.Close()
}

坑点basicfont.Face7x13 只有7x13像素,中文“天”可能显示不出来。解决方案:换字体,比如加载 simhei.ttf

3 循环生成365帧

func main() {
    totalDays := 365
    for day := totalDays; day >= 0; day-- {
        filename := fmt.Sprintf("frames/frame_%03d.png", day)
        generateFrame(day, filename)
    }
}

每帧文件名按 frame_365.pngframe_000.png 排列,后面FFmpeg按顺序合成。

4 用FFmpeg合成视频

生成完图片,在终端执行:

ffmpeg -framerate 24 -i frames/frame_%03d.png -c:v libx264 -pix_fmt yuv420p output.mp4
  • -framerate 24:每秒24帧,这样倒计时走24秒(365/24≈15.2秒)
  • 如果你想要精确1秒1天,设 -framerate 1,但播放效果会跳帧

我个人经验:设为10帧/秒,画面流畅又不至于太长,365天大概36.5秒。

进阶玩法:加边框、阴影、进度条

光显示数字太单调,我试了加一个动态进度条

  • 在图片下方画一个长条
  • 从左到右代表时间过去
func drawProgressBar(img *image.RGBA, day, total int) {
    barWidth := 600
    barHeight := 20
    xStart := 100
    yStart := 500
    // 灰色背景
    bgRect := image.Rect(xStart, yStart, xStart+barWidth, yStart+barHeight)
    draw.Draw(img, bgRect, &image.Uniform{color.Gray{Y: 200}}, image.Point{}, draw.Src)
    // 填充部分
    filledWidth := int(float64(barWidth) * float64(total-day) / float64(total))
    fgRect := image.Rect(xStart, yStart, xStart+filledWidth, yStart+barHeight)
    draw.Draw(img, fgRect, &image.Uniform{color.RGBA{0, 100, 200, 255}}, image.Point{}, draw.Src)
}

效果:数字从365到0,进度条从全空到全满,视觉上更有“流逝感”。

怎么导入PR?

生成的 output.mp4 直接拖进PR时间线。

技巧

用Go语言搞定PR视频,手写一个365天倒计时生成器

  • 如果PR里需要透明背景(比如在画面上叠加),生成视频时用 -pix_fmt rgba 并输出MOV格式
  • 但FFmpeg的透明通道支持有限,更稳的方法是生成PNG序列,在PR里导入为图片序列

PR导入图片序列步骤:

  1. 文件 → 导入
  2. 选中第一张 frame_000.png
  3. 勾选“图像序列”
  4. 确定

然后PR自动认成一整个视频片段。

常见翻车现场(我都经历过)

  • 字体显示方块:系统字体没加载对,改成绝对路径加载字体文件
  • 视频倒放:文件名排序时,frame_100.png 会排在 frame_99.png 前面,导致顺序错乱,解决:文件名统一补零成三位数
  • 帧率太高文件太大:365帧如果每秒30帧,只有12秒,但文件可能几十MB,调低帧率或降低分辨率(-s 640x480

其他思路:文本文件+PR表达式

如果不想写Go代码,也可以用PR自带的表达式

  1. 新建文本层
  2. 在“源文本”属性上加表达式:
    days = 365 - Math.floor(time / 1);
    if (days < 0) days = 0;
    days + " 天";

    缺点是只有数字,没有进度条,而且PR表达式没法直接画图形,所以我还是推荐Go生成视频帧,灵活性高得多。

最终建议:写脚本自动化

存成 run.sh

#!/bin/bash
go run generate.go
ffmpeg -framerate 10 -i frames/frame_%03d.png -c:v libx264 -pix_fmt yuv420p countdown_365.mp4
rm frames/*.png

以后随时跑一下,新视频就出来了,如果需要改颜色、字体、加文字,改Go代码再运行。

我用这个方法给朋友的生日、结婚纪念日都做过倒计时视频,甚至帮他公司做了个“距离年会还有XX天”的每日更新素材。关键是:你只需要写一次代码,365张图自动出来,PR里拖进去秒变高大上。

别被“写代码”三个字吓到,试试看,你会发现比手动改一晚上数字值多了。

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

(10)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-06-26

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

  • kyadmin
    kyadmin 2026-06-26

    希望本篇文章《用Go语言搞定PR视频,手写一个365天倒计时生成器》能对你有所帮助!

  • kyadmin
    kyadmin 2026-06-26

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

  • kyadmin
    kyadmin 2026-06-26

    本文概览:先别急着搜“pr怎么做一个365天倒计时视频”——我们换条路:用Go语言直接生成视频帧。你可能觉得这跟PR有什么关系?其实PR是剪辑...

    联系我们

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

    关注我们