单个视频加时间戳不难,难的是几十上百个视频要统一处理。这篇讲整文件夹批量加时间戳的几种做法,以及批量场景下那些单个处理时遇不到的坑。
很多人以为批量就是"把单个的方法重复 N 遍",实际做起来会发现,麻烦全在别的地方:
这些在处理单个视频时都不是问题,一到批量就全冒出来了。
Windows 下最基础的写法,遍历文件夹里所有 mp4:
@echo off
if not exist "output" mkdir "output"
for %%f in (*.mp4) do (
echo 正在处理: %%f
ffmpeg -i "%%f" -vf "drawtext=fontfile='C:/Windows/Fonts/simhei.ttf':text='%{localtime:%Y-%m-%d}':x=20:y=20:fontsize=36:fontcolor=white:box=1:boxcolor=black@0.5" -c:a copy "output%%f" -y
)
echo 全部完成
pause
这段能跑。但要拿它处理真实的一批视频,至少还得补三件事。
@echo off
if not exist "output" mkdir "output"
if exist "failed.txt" del "failed.txt"
for %%f in (*.mp4) do (
echo 正在处理: %%f
ffmpeg -i "%%f" -vf "drawtext=fontfile='C:/Windows/Fonts/simhei.ttf':text='%{localtime:%Y-%m-%d}':x=20:y=20:fontsize=36:fontcolor=white:box=1:boxcolor=black@0.5" -c:a copy "output%%f" -y 2>nul
if errorlevel 1 echo %%f >> failed.txt
)
echo 完成,失败的文件见 failed.txt
批量任务跑到一半断了,重跑不该从头再来:
for %%f in (*.mp4) do (
if not exist "output%%f" (
ffmpeg -i "%%f" -vf "..." -c:a copy "output%%f" -y
) else (
echo 跳过已处理: %%f
)
)
这个是批处理最难搞的。FFmpeg 里可以用表达式让字号跟着画面宽度走:
fontsize=w/40
意思是字号取画面宽度的 1/40——1920 宽出来是 48,1280 宽出来是 32,能自动适配。但位置也得跟着变,否则 4K 视频上时间戳会缩在角落一小点:
x=w/60:y=h/60:fontsize=w/40
全部用相对值,才能一套参数吃所有分辨率。
补完这三个补丁,脚本已经四五十行了。它能用,但你要接受:
视频时间戳添加工具·批量版就是针对这个场景做的:
批量场景下比脚本省事的地方:
只处理三五个视频的话,单文件版就够用,不用上批量版。
1. 先拿一个文件试。不管用脚本还是工具,先单独处理一个,打开看效果。确认字号、位置、颜色都对了,再批量跑。这一步能避免"跑了三小时全部重来"。
2. 输出到独立目录,不要覆盖原文件。脚本里务必用 output 这样的子目录。一旦参数设错又覆盖了原片,没法挽回。
3. 估算磁盘空间。硬字幕烧录会生成新文件,占用和原片相当。100 个视频共 50GB,处理后就是 100GB。空间不够的话,任务跑到一半会失败。
Q:批量处理能不能让每个视频显示各自的拍摄时间?
可以,但需要能读取每个文件的元数据或文件名。纯批处理脚本要配合 ffprobe 逐个读取再拼命令,比较麻烦;工具一般会自动处理。
Q:一批视频分辨率不一样,字号怎么统一?
别用固定字号,用相对值 fontsize=w/40,位置也用 x=w/60:y=h/60,这样各种分辨率都能自适应。
Q:批量处理很慢,怎么加快?
三个方向:开启显卡加速;用内封字幕模式(不重编码,快得多);提高并发数。三者里内封字幕提速最明显,代价是部分播放器不显示。
Q:中途想停下来怎么办?
脚本直接关窗口,已完成的文件保留,配合"跳过已处理"的写法可以续跑。工具一般有暂停/停止按钮。
86998867
微信同号
