先别急着搜“pr怎么做一个365天倒计时视频”——我们换条路:用Go语言直接生成视频帧。
你可能觉得这跟PR有什么关系?其实PR是剪辑,但如果你会写Go代码,就能自动生成带倒计时的视频素材,然后拖进PR里用,而且这个方法可定制、可批量、不需要手动一帧帧调。
我自己试过几轮,踩了不少坑,今天把最实用的写法分享出来。
核心思路:用Go生成视频帧
PR做倒计时视频,一般是新建文本图层,手动改数字,但365天太长,手动改不现实,所以思路是:用Go逐帧生成图片,再拼成视频。
需要的工具:
- Go标准库
image和image/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.png 到 frame_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时间线。
技巧:

- 如果PR里需要透明背景(比如在画面上叠加),生成视频时用
-pix_fmt rgba并输出MOV格式 - 但FFmpeg的透明通道支持有限,更稳的方法是生成PNG序列,在PR里导入为图片序列
PR导入图片序列步骤:
- 文件 → 导入
- 选中第一张
frame_000.png - 勾选“图像序列”
- 确定
然后PR自动认成一整个视频片段。
常见翻车现场(我都经历过)
- 字体显示方块:系统字体没加载对,改成绝对路径加载字体文件
- 视频倒放:文件名排序时,
frame_100.png会排在frame_99.png前面,导致顺序错乱,解决:文件名统一补零成三位数 - 帧率太高文件太大:365帧如果每秒30帧,只有12秒,但文件可能几十MB,调低帧率或降低分辨率(
-s 640x480)
其他思路:文本文件+PR表达式
如果不想写Go代码,也可以用PR自带的表达式:
- 新建文本层
- 在“源文本”属性上加表达式:
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
评论列表(4条)
我是be365的签约作者“kyadmin”!
希望本篇文章《用Go语言搞定PR视频,手写一个365天倒计时生成器》能对你有所帮助!
本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名
本文概览:先别急着搜“pr怎么做一个365天倒计时视频”——我们换条路:用Go语言直接生成视频帧。你可能觉得这跟PR有什么关系?其实PR是剪辑...