Manim 移动端适配完整实践指南:9:16 竖屏视频输出与三个常见坑
【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim
上个月我把一段用 manim 渲好的公式推导发给同事,他手机上一划开——画面上下被裁掉一截,公式只剩半截。问题不在播放器:manim 是个社区维护的 Python 数学动画框架,默认输出 16:9 的 1920×1080,而手机屏幕是 9:16。manim 移动端适配说白了就三件事:把渲染分辨率改成竖屏、在变窄的逻辑画框里重排画面、选一个手机友好的输出格式。这篇按踩坑顺序把这三件事讲清楚。
渲染命令怎么写:-r 与 -q 的分工
manim 的默认尺寸来自配置文件 manim/_config/default.cfg:pixel_width = 1920、pixel_height = 1080、frame_rate = 60。要改它,有两条路:
-q走质量预设。预设定义在 manim/constants.py 的QUALITIES里,但全是 16:9,对竖屏帮不上忙,只列出来供对照:
| 预设 | 缩写 | 分辨率 | 帧率 |
|---|---|---|---|
| low | -ql | 854×480 | 15 |
| medium | -qm | 1280×720 | 30 |
| high | -qh | 1920×1080 | 60 |
| production | -qp | 2560×1440 | 60 |
| fourk | -qk | 3840×2160 | 60 |
-r W,H才是竖屏的正门。它在帮助文本里写得很直白:用于"16:9 不可能"的场景,分隔符支持,;-(见 manim/cli/render/render_options.py 的validate_resolution)。
最小可跑的竖屏命令:
# -r 指定竖屏分辨率,--fps 降到 30 省手机流量,-p 渲完自动打开 manim -r 1080,1920 --fps 30 -p mobile.py VerticalScene⚠️ 输出路径按media/videos/<脚本名>/<质量目录>/组织,自定义分辨率时质量目录名会按实际像素生成,别用预设名去找文件。
竖屏分辨率怎么设:逻辑坐标系会变窄
这是最容易忽略的一点。manim 里 mobject 定位用的逻辑坐标系,高度默认恒为 8.0,宽度由宽高比自动推:frame_width = frame_height × aspect_ratio(逻辑见 manim/_config/utils.py 中frame_width的消化逻辑)。
换算一下就明白竖屏意味着什么:
| 输出分辨率 | 宽高比 | 逻辑画框宽×高 |
|---|---|---|
| 1920×1080 | 16:9 | 14.2 × 8.0 |
| 1080×1920 | 9:16 | 4.5 × 8.0 |
| 1280×1920 | 2:3(平板) | 5.33 × 8.0 |
也就是说,9:16 时你的画布从"14.2 宽"骤缩到"4.5 宽",原来横着排的东西直接挤不下。官方文档 里深讲了坐标系,但实操层面记住一条:布局只信相对位置(next_to/to_edge),别写死绝对坐标。
比如 example_scenes 里用的这张 2:1 横版图,直接丢进 9:16 画框会顶穿左右边界,得按画框宽度缩一下:
# mobile.py —— 只写相对布局,换分辨率时不用改坐标 from manim import * class VerticalScene(Scene): def construct(self): title = Text("二次方程求根公式", font_size=44).to_edge(UP) formula = MathTex(r"x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}") formula.next_to(title, DOWN, buff=0.8) # 相对定位,画框变窄也不穿帮 self.play(Write(title), Write(formula)) self.wait(1)字号也会受画框宽度影响:16:9 下看着刚好,9:16 下同一font_size的长文本可能换行,建议竖屏场景把主标题字号压到 40~48 一档先试。
三个常见坑
坑 1:在 Scene 里改 config 不生效
def construct(self): config.pixel_width = 1080 # ⚠️ 无效:相机和渲染器启动时已按 1920×1080 建好 config.pixel_height = 1920渲染器、相机、文件写入器都在Scene实例化时就读了尺寸,construct里再改config只是改了个字典,视频还是横屏。分辨率一律走命令行-r或manim.cfg,代码内不碰尺寸。
坑 2:-q和-r混用
-q会一次性写入宽、高、帧率三个值,-r只覆盖宽高,帧率还挂在-q给的值上。结果就是想要 30fps 却出了 60fps,或者想要 720p 竖屏却被预设拽回 1080p 的帧率。另外config.quality属性对非预设尺寸返回None,依赖它做分支的代码会悄悄失效。非 16:9 场景直接-r+--fps,-q别掺和。
坑 3:透明背景 + 手机播放
带-t --transparent时,--format=auto会解析成mov(带 alpha 通道)。这种文件体积大、手机播放器支持参差。移动端分发绝大多数情况是配固定背景色的,--background_color给个色值就完了;真要做透明素材,显式定--format,别吃auto的默认值。
manim.cfg 怎么持久化配置
同一个脚本要反复以竖屏渲染的,写进项目根目录的manim.cfg一劳永逸:
# manim.cfg —— 与脚本同目录,CLI 没显式传 -r/--fps 时按这里的值渲染 [CLI] pixel_width = 1080 pixel_height = 1920 frame_rate = 30 background_color = BLACK format = mp4优先级规则在 default.cfg 的注释里写明了:命令行标志覆盖配置文件,未显式传递的标志保留配置值。所以临时改横屏用-r 1920,1080 --fps 60压过配置即可,不用改文件。
移动端格式怎么选
--format的完整取值在 render_options.py:auto/none/png/png-sequence/gif/mp4/webm/mov。按用途取舍:
- mp4:手机兼容性最好,竖屏视频分发默认选它
- webm:网页嵌入优先,VP9 压缩率好
- gif:只有两三秒的短循环动画,别拿它跑整段场景
- png / png-sequence:
-s(--save_last_frame)只存末帧,适合快速截图核对竖屏排版
速查清单
- 竖屏一行流:
manim -r 1080,1920 --fps 30 -p mobile.py VerticalScene - 非 16:9 不碰
-q,用-r+--fps显式指定,避免帧率被预设带走 - 布局只用
next_to/to_edge相对定位;9:16 下逻辑画框宽仅 4.5,横版内容必穿帮 - 尺寸改
manim.cfg或命令行,别在Scene里改config,相机早建好了 - 移动端分发默认 mp4 + 固定背景色;透明场景慎用
auto,它会落到 mov
【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考