离线竖屏视频渲染器(Python + ffmpeg)
把中文文案/分镜脚本渲染成竖屏短视频。不依赖浏览器、不依赖 Remotion,只要 Python + ffmpeg。
在沙箱等受限环境里,这条路径比 Remotion 可靠得多(Remotion 需要下载 Chromium 且依赖树巨大)。
何时用
- 用户要把一段文案变成竖屏短视频,且要“成片”而不是“给你工程自己跑”
- 环境无浏览器 / 装不动 Remotion / npm 拉包极慢
- 只有 Python + ffmpeg 可用
本机环境事实(装东西前先看)
- Python:
C:/Users/admin/.workbuddy/binaries/python/versions/3.13.12/python.exe - venv:
C:/Users/admin/.workbuddy/binaries/python/envs/default
⚠️ Windows 下可执行文件在Scripts/(Scripts/python.exe),不是bin/ - pip 源(实测):阿里云
https://mirrors.aliyun.com/pypi/simple/✅ | pypi.org ✅ | 腾讯云 ✅ |
清华pypi.tuna.tsinghua.edu.cn返回 403 ❌(本沙箱被拒,别用) - 依赖:
pillow numpy(numpy 可缺省,脚本有 fallback) - 中文字体:
C:/Windows/Fonts/msyh.ttc(微软雅黑) /msyhbd.ttc(雅黑粗体) /simhei.ttf(黑体) - ffmpeg:
C:/Users/admin/AppData/Local/Programs/ffmpeg/bin/ffmpeg.exe
执行流程
- 装依赖(venv 内):
bash VENV="C:/Users/admin/.workbuddy/binaries/python/envs/default" "$VENV/Scripts/python.exe" -m pip install -i https://mirrors.aliyun.com/pypi/simple/ pillow numpy - 复制模板
scripts/render_template.py,改:SEG(分镜时长/色调)、C(配色)、各s_*分镜函数与文案。 - 冒烟测试:只跑绘图逻辑、每段少量帧、不启 ffmpeg(见模板
_smoke思路),先确认无运行时报错。 - 渲染:
"$VENV/Scripts/python.exe" render_template.py→ 输出out/*.mp4(2010 帧约 40 秒)。 - 抽帧验证(必做,别只信代码):
bash FF="C:/Users/admin/AppData/Local/Programs/ffmpeg/bin/ffmpeg.exe" "$FF" -v error -i out.mp4 -ss T -frames:v 1 -y chk.png # 精确 seek,逐分镜核对
重点看:中文是否正常、文字与底色是否可辨、有无元素重叠、构图是否大片留白。
关键坑(务必遵守)
- subprocess 管道死锁(最坑):
Popen(stderr=PIPE)却等写完全部帧才read(),
ffmpeg 进度日志写满 64KB stderr 缓冲区后阻塞 → 不再消费 stdin → 父进程write()也卡死。
表现:跑很久却几乎没进度、输出文件仅几十字节。必须把 stderr 重定向到文件,不要用 PIPE。 -movflags +faststart会整片缓冲到内存,编码完成前输出文件一直是几十字节 →
不能用文件大小判断进度(看脚本的帧计数打印)。- PIL 文字 fill 与底色同色会不可见。标签/胶囊底色要用淡色:
mix(bg, color, 0.13),
不要直接用主色填充(RGB 模式不支持 alpha,原设计的“12% 透明填充”必须手动混色)。 - 模糊层要预渲染缓存:光晕/柔光的大半径
GaussianBlur只做一次,每帧只改 alpha,
否则 2010 帧会慢十倍。 - 动画结束后的文字/图形走直接绘制快路径(不做图层合成),大幅提速。
- Bash 默认 120 秒超时会杀进程 → 长时间渲染用后台运行,或缩短单次命令。
- 竖屏构图:内容别只堆在上半屏,底部留白过半会显得空;标签一般贴底(y≈1700–1810)。
输出规格(本模板默认)
1080×1920 · 30fps · libx264 -preset veryfast -crf 20 -pix_fmt yuv420p
+ anullsrc 静音 AAC 音轨 + -movflags +faststart。
需要 BGM 时:ffmpeg -i video.mp4 -i bgm.mp3 -c:v copy -c:a aac -shortest out.mp4。
参考实现
本机 fanrongting-remotion/render_frames.py(繁荣华庭 7 分镜,含户型图/楼层剖面/地铁/学校/生活蒙太奇)
是完整范例,可直接照抄结构。