Manim 移动端适配完整实践指南:9:16 竖屏视频输出与三个常见坑
2026/9/16 18:20:24 网站建设 项目流程

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 = 1920pixel_height = 1080frame_rate = 60。要改它,有两条路:

  • -q走质量预设。预设定义在 manim/constants.py 的QUALITIES里,但全是 16:9,对竖屏帮不上忙,只列出来供对照:
预设缩写分辨率帧率
low-ql854×48015
medium-qm1280×72030
high-qh1920×108060
production-qp2560×144060
fourk-qk3840×216060
  • -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×108016:914.2 × 8.0
1080×19209:164.5 × 8.0
1280×19202: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只是改了个字典,视频还是横屏。分辨率一律走命令行-rmanim.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)只存末帧,适合快速截图核对竖屏排版

速查清单

  1. 竖屏一行流:manim -r 1080,1920 --fps 30 -p mobile.py VerticalScene
  2. 非 16:9 不碰-q,用-r+--fps显式指定,避免帧率被预设带走
  3. 布局只用next_to/to_edge相对定位;9:16 下逻辑画框宽仅 4.5,横版内容必穿帮
  4. 尺寸改manim.cfg或命令行,别在Scene里改config,相机早建好了
  5. 移动端分发默认 mp4 + 固定背景色;透明场景慎用auto,它会落到 mov

【免费下载链接】manimA community-maintained Python framework for creating mathematical animations.项目地址: https://gitcode.com/GitHub_Trending/man/manim

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询