Movo は動画をプロジェクト JSON で書き、CLI から検証・描画・計測するツールです。
22 のコマンドがあり、どれも movo <コマンド> --help で同じ説明が読めます。
$ movo doctor # 環境の診断
$ movo init my-video # 雛形を作る
$ cd my-video
$ movo validate movo.json # 検証
$ movo frame movo.json -t 1 -o check.png # 1 枚だけ描く
$ movo render movo.json -o out.mp4 # 書き出す
movo init は movo.json と assets/ を作ります。
サンプル素材も一緒に生成されるので、そのまま render まで通ります。
テンプレートは --template で選べます
(basic / text / physics /
character / showcase)。
movo frame で詰めてください。数秒で 1 枚出ます。
AI エージェントや自動化スクリプトから使うときは、次の順に回すと安定します。 画面操作は 1 つも要りません。
movo skill list --json、movo list effects --json、
movo list easings --json で、その版で実在する名前が取れます。
名前を推測せず、ここから選ばせると失敗が減ります。
https://movo.dev/schema/project-v1.json です
($schema に書いておくとエディタの補完が効きます)。
movo validate mv.json --json の
issues[] は path と message を持つので、
そのまま修正指示にできます。終了コード 3 で «JSON が不正» と分かります。
movo frame mv.json -t 4.0 -o check.png。
画像を見られるエージェントなら、ここで «読めるか» を判断できます。
movo render のあと
movo profile out.mp4 --json / movo compare で
狙った作風に寄っているかを数値で確認します。
--json: 対応コマンドは結果を JSON で返します。--quiet: 進捗表示を抑えます。ログを読ませるときに。
乱数は project.seed で固定され、--jobs で区間に割って
並列に描いても出力は変わりません。だから
生成した JSON を git に入れて差分レビューでき、
CI で «前回と同じものが出ること» を検査できます。
--seed で 1 回だけ上書きすることもできます。
movo init <名前> | プロジェクトの雛形を作る。--template / --width / --height / --fps |
movo validate <file> | スキーマ検証と意味検証。--json / --strict |
movo render <file> | 書き出す。-o / -f / -q / --jobs / --from / --to / --seed |
movo frame <file> | 1 枚だけ描く。-t 秒 または --frame 番号 |
movo frames <file> | 連番で描く。--from / --to / --pattern |
movo preview <file> | ローカルサーバーを立ててブラウザで見る(既定ポート 7777) |
movo make <recipe> | 保存した «作り方» からもう一度作る |
movo params <file> | 差し替えられる項目を一覧する |
movo batch <テンプレート> | 1 つの型 × N 通りの入力値を連番で書き出す。--input / --out / --continue |
movo analyze <音声> | BPM・1 拍目・小節・区間を推定する |
movo lyrics align <音声> | 時刻の無い歌詞に時刻を付けて .lrc にする |
movo make-mv <音声> | 曲に合わせた MV を 1 本作る |
movo profile <動画|JSON> | 映像を 8 つの指標で数値にする |
movo compare <動画> | 目標値と突き合わせ、外れた項目の直し方を出す |
movo skill <list|show|render|expand|new> | スキル(テンプレート)を扱う |
movo list <種類> | 使える部品の一覧(後述) |
movo assets <generate|plan> | 宣言された AI 素材を生成する/生成計画だけ見る |
movo plugin <list|create> | プラグインを一覧・作成する |
movo config <set|get|list|unset|path> | API キーなどの設定(~/.movo/config.json に 600 で保存) |
movo doctor | Python・ffmpeg・フォント・NumPy / Numba を診断する |
movo setup-ffmpeg | ffmpeg を ~/.movo/bin に用意する |
-h, --help | ヘルプ |
-v, --version | バージョン |
--quiet | 進捗表示を抑える |
-V, --verbose | 詳細ログ |
--debug | デバッグログ(例外の追跡も出す) |
--json | 結果を JSON で出す(対応コマンドのみ) |
プロジェクト JSON は プロジェクト → 動画設定 → シーン → レイヤー
という入れ子です。必須は video.width と video.height だけで、
あとは足していく形です。
{
"$schema": "https://movo.dev/schema/project-v1.json",
"movoVersion": "1.0",
"project": { "name": "my-video", "seed": 12345 },
"video": { "width": 1920, "height": 1080, "fps": 30, "duration": 6, "background": "#0f1220" },
"assets": { "logo": "assets/images/logo.png" },
"scenes": [
{
"id": "main",
"start": 0,
"duration": 6,
"layers": [ ... ]
}
],
"audio": [],
"render": { "quality": "standard" },
"output": { "format": "mp4", "codec": "h264" }
}
| キー | 中身 |
|---|---|
project | name / seed / bpm / root。seed が決定性の要です |
video | width / height(必須)、fps / duration / background / safeArea |
assets | 素材の名前 → パス。ここで宣言した名前しかレイヤーから参照できません |
variables | 式から読める値。使い回す数値を置く |
variants | 同じ JSON から 16:9 / 9:16 / 1:1 を出すための «違うところだけ» |
camera | 2.5D カメラ。レイヤーの transform.z と組み合わせて視差を作る |
scenes | カットの配列 |
audio | 音のトラック |
render | quality: draft / preview / standard / high / ultra |
output | format: mp4 / webm / mov / gif / png-sequence / wav |
id と type が要ります。id は全体で一意にしてください
(重複は validate で落ちます)。位置と大きさは transform、
見た目は種別ごとのキー(style / shape / asset …)です。
{
"id": "title",
"type": "text",
"text": "秋の窓",
"start": 0,
"end": 4,
"style": {
"size": 96,
"color": "#ffffff",
"align": "center",
"stroke": { "color": "#00000099", "width": 4 }
},
"transform": {
"x": 960, "y": 260,
"anchorX": 0.5, "anchorY": 0.5,
"opacity": 1, "rotation": 0, "scale": 1
},
"effects": [ { "type": "bloom", "amount": 0.4 } ],
"mask": { "type": "rectangle", "feather": 12 }
}
start / end はシーン内の秒です。省くとシーンいっぱいになります。
group レイヤーの子は layers に入れます。
時間の欄には秒のほかに 拍と小節が書けます。
"duration": "8bar"、"start": "4beat" のように書くと、
project.bpm から秒へ解決されます。BPM は曲から取ることもできます。
"project": { "bpm": { "fromAudio": "song", "fallback": 120 } }
値を動かす方法は 3 つあります。混ぜても使えます。
"animations": [
{
"property": "transform.opacity",
"keyframes": [
{ "time": 0, "value": 0 },
{ "time": 1, "value": 1, "easing": "easeOut" }
]
}
]
イージングは 45 種。movo list easings で一覧できます。
毎フレーム評価される式です。time / bpm /
beatPulse(...) / wiggle(...) / audio などが使えます。
式エンジンはサンドボックスで、ファイル・ネットワーク・プロセスには触れません。
"y": { "expression": "540 - beatPulse(bpm, 1, 9) * 14" }
周期的な揺らぎを値に足します。frequency / amplitude /
phase を持ち、combine(add / multiply /
replace / min / max / average)で
元の値との混ぜ方を選べます。
"rotation": {
"value": 0,
"modulator": { "type": "sine", "frequency": 0.5, "amplitude": 3 }
}
数と名前は版によって増えます。実際に使う版で movo list を叩いて確かめてください。
--json を付ければそのままエージェントに渡せます。
$ movo list layers
$ movo list effects --json
| 種類 | 中身 | v0.1.0 での数 |
|---|---|---|
layers | レイヤーの種別(text / image / shape / particle / mesh …) | 24 |
effects | エフェクト(bloom / glitch / halftone / lensFlare …) | 69 |
easings | イージング | 45 |
blends | ブレンドモード | 22 |
deformers | 変形(bend / wave / meshWarp …) | 16 |
masks | マスクの形 | 10 |
particles | 粒子の種類 | 7 |
physics | 物理(剛体・拘束・IK) | 6 |
renderers | レンダラ | 6 |
profiles | 作風の目標値 | 10 |
ほかに modulators / functions / formats /
presets が引けます。
スキルは «入力値だけで絵になる» ひとまとまりです。JSON をゼロから書かずに、 名前と値を渡すだけで動画になります。大きさの違いで 4 段階あります。
| 種類 | 置き場 | 中身 | 同梱数 |
|---|---|---|---|
| 基礎アニメーション | animations/ | 1 レイヤーぶんの動き(登場・退場・持続) | 28 |
| スキル | skills/ | レイヤー群(文字と飾り、天候の演出など) | 15 |
| シーン | scenes/ | 1 カットぶん(尺・背景・レイヤー一式) | 12 |
| ムービー | movies/ | 1 本ぶん(シーンの並び) | 3 |
$ movo skill list --json # 一覧(機械可読)
$ movo skill show lyric-line # 入力値と生成されるレイヤー
$ movo skill render weather --set kind=sakura --preset 720p
$ movo skill expand title-card --set title=Movo -o project.json
入力値の渡し方は 3 通りで、--set がいちばん強く効きます。
--set key=value | 何度でも。数値・true/false・JSON 配列も解釈します |
--with '{"text":"あ"}' | まとめて JSON で |
--inputs <file.json> | ファイルから |
下の GIF は すべて Movo が実際に書き出したものです。
コマンドはそのままコピーして動きます(-f gif で書き出したあと、
README の手順で ffmpeg のパレット生成を通してファイルを小さくしています)。
素材は Movo-py/assets/free/ の
CC0 とパブリックドメインのものだけです。
飛ぶ:
audio-bars /
counter-stat /
cutin-title /
flash-cut /
glitch-overlay /
logo-sting /
lyric-line /
lyric-vertical /
manga-panel /
night-sky /
photo-slide /
physics-drop /
split-screen /
title-card /
weather
audio-bars — 音声ビジュアライザ
audio に wav を渡すと波形そのものに同期し、渡さなければ
bpm で拍を作ります。中央の円は低域に反応して拡大し、拍で跳ねます。
主な入力値
audio(既定は空)/style(bars /
mirror / wave、既定 bars)/
bars(既定 56・2〜512)/ring(既定 true)/
bpm(既定 120)/duration(既定 8)
$ movo skill render audio-bars --set style=mirror --set bars=32 \
--set bpm=120 --set duration=3 --width 640 --height 360 --fps 12 \
--background '#0a0a12' -f gif -o audio-bars.gif
counter-stat — 数字カウンター
from から to まで数字が回ります。
3 桁区切りは separator、単位は suffix で付きます。
見出しと下線が一緒に出るので、実績や統計をそのまま置けます。
主な入力値
label(既定「総再生数」)/from(既定 0)/
to(既定 12345)/suffix/
separator(既定 true)/size(既定 120)
$ movo skill render counter-stat --set label=総再生数 --set to=12345 \
--set suffix=回 --set size=280 --set duration=3 --from 0.25 \
--width 640 --height 360 --fps 12 --background '#0b0b10' -f gif -o counter-stat.gif
cutin-title — 集中線カットイン
集中線が内側から開きながら、文字が四方から集まります。
線は lineCount 本まで増やせて、脈は bpm に同期します。
サビ前の 1〜3 秒に置くための短いカットです。
主な入力値
text(必須・既定「サビ」)/bpm(既定 174)/
lines(既定 true)/lineCount(既定 180・4〜2000)/
textSize(既定 140)/background(既定 #12081c)
$ movo skill render cutin-title --set text=サビ --set bpm=174 \
--set lineCount=120 --set duration=2.5 \
--width 480 --height 270 --fps 10 -f gif -o cutin-title.gif
flash-cut — フラッシュカット
画面いっぱいの色が不透明度 1 から 0 へ落ち、同時に 220 本の線が外へ散ります。
他の映像に重ねて使うトランジションで、単体で描くと最後は透明です
(この GIF は --background で下地を敷いています)。
主な入力値
color(既定 #ffffff)/
duration(既定 0.6・0.05 以上)/lines(既定 true)
$ movo skill render flash-cut --set duration=1 \
--width 640 --height 360 --fps 20 --background '#12081c' -f gif -o flash-cut.gif
glitch-overlay — グリッチのオーバーレイ
9 本の帯が乱数で跳ね、色収差とノイズが全画面に重なります。
interval 秒ごとに発作的に暴れ、shake で画面ごと揺れます。
切り替えの直前に 1 秒だけ置くのが効きます。
主な入力値
amount(既定 0.6・0〜1)/color(既定 #4cc9f0)/
interval(既定 2・1 以上)/shake(既定 20)
$ movo skill render glitch-overlay --set amount=0.7 --set interval=1 \
--set duration=1.6 --width 480 --height 270 --fps 12 \
--background '#101018' -f gif -o glitch-overlay.gif
logo-sting — ロゴスティング
asset に渡したロゴ画像(無ければ text の文字)が
回りながら現れ、後ろの発光が膨らみます。出たあとも脈打ち続けるので、
2〜3 秒の締めのカットとしてそのまま置けます。
主な入力値
asset(宣言済みの素材名)/text(既定 MOVO)/
size(既定 320)/glowColor(既定 #4cc9f0)/
duration(既定 2.5)
$ movo skill render logo-sting --set text=MOVO --set duration=2.5 \
--width 640 --height 360 --fps 12 -f gif -o logo-sting.gif
lyric-line — 歌詞 1 行(カラオケ塗り)
未塗りの baseColor から fillColor へ、
左から塗られていきます。塗る区間は startAt〜endAt
(endAt が 0 なら尺いっぱい)。reading を渡すと下にふりがなが並びます。
主な入力値
text(必須)/reading/size(既定 64)/
baseColor(既定 #5d6790)/fillColor(既定 #ffd166)/
startAt(既定 0.25)/y(中心からの縦位置)
$ movo skill render lyric-line --set text=夜のとばりが降りて \
--set reading=よるのとばりがおりて --set size=150 --set duration=3 \
--width 640 --height 360 --fps 12 --background '#0a0a12' -f gif -o lyric-line.gif
lyric-vertical — 縦書きの歌詞
改行ごとに列が増え、右から左へ並びます。塗りは上から下です。
改行は --set では書けないので、--with に JSON で
\n を渡してください。
主な入力値
text(必須・改行で列)/size(既定 56)/
fillColor(既定 #4cc9f0)/x(中心からの横位置)/
startAt(既定 0.25)
$ movo skill render lyric-vertical --with '{"text":"静かに\n息をする"}' \
--set size=140 --set duration=3 --width 640 --height 360 --fps 12 \
--background '#0a0a12' -f gif -o lyric-vertical.gif
manga-panel — 漫画コマ風
写真を網点と輪郭線で漫画化し、コマ枠が手描きの震えつきで引かれ、
集中線が回り、吹き出しが飛び出します。levels が階調数、
dotSize が網点の大きさです。
素材を使うので、宣言済みの名前を渡せるプロジェクト JSON から呼びます。
主な入力値
asset(空ならトーンだけ)/text(空で吹き出しが消える)/
levels(既定 4・2〜12)/dotSize(既定 5)/
lines(既定 true)/frame(既定 true)
{
"movoVersion": "1.0",
"project": { "name": "manga-panel", "seed": 3 },
"video": { "width": 400, "height": 225, "fps": 8, "duration": 1.6, "background": "#f5f2ea" },
"assets": { "susuki": "assets/free/susuki.png" },
"scenes": [{ "use": [{ "skill": "manga-panel", "with": {
"asset": "susuki", "text": "CLIMAX", "levels": 4, "dotSize": 5, "duration": 1.6
} }] }]
}
$ movo render manga-panel.json -f gif -o manga-panel.gif
night-sky — 夜空
topColor から bottomColor への縦のグラデーションに、
stars 個の粒を撒いた背景です。ほかのスキルの下に敷いて使います。
主な入力値
topColor(既定 #05060f)/
bottomColor(既定 #243b7a)/
stars(既定 140)/duration(既定 8)
$ movo skill render night-sky --set stars=160 --set duration=4 \
--width 560 --height 315 --fps 10 -f gif -o night-sky.gif
photo-slide — 写真のスライド
素材名を並べるだけで、1 枚 each 秒のケン・バーンズと
overlap 秒のクロスフェードでつなぎます。film でフィルム調、
caption で下にキャプションが出ます。尺は「枚数 × each」で決まります。
主な入力値
assets(宣言済みの素材名・カンマ区切り)/each(既定 3)/
overlap(既定 0.6)/film(既定 true)/caption
{
"movoVersion": "1.0",
"project": { "name": "photo-slide", "seed": 3 },
"video": { "width": 400, "height": 225, "fps": 8, "duration": 1.4, "background": "#0b0b10" },
"assets": { "susuki": "assets/free/susuki.png", "tree": "assets/free/tree.png" },
"scenes": [{ "use": [{ "skill": "photo-slide", "with": {
"assets": ["susuki", "tree"], "each": 1.0, "overlap": 0.4,
"film": true, "caption": "秋の記録"
} }] }]
}
$ movo render photo-slide.json -f gif -o photo-slide.gif
physics-drop — 物理で落とす
床と壁が静的な剛体、玉が動的な剛体で、
当たり判定を実際に解いて跳ねます。restitution が反発、
gravity が重力です。キーフレームでは書けない散らばり方になります。
主な入力値
count(既定 5・1〜40)/radius(既定 48)/
restitution(既定 0.7・0〜1)/gravity(既定 1400)/
walls(既定 true)
$ movo skill render physics-drop --set count=7 --set restitution=0.75 \
--set duration=3 --width 640 --height 360 --fps 15 \
--background '#101018' -f gif -o physics-drop.gif
split-screen — 分割画面
画面を columns×rows に割り、panels に書いた
コンポジション名を各マスに敷けます(書かなかったマスは colors の色)。
merge の時刻に全マスが中央へ寄って 1 枚になります。
主な入力値
columns(既定 2・1〜8)/rows(既定 1・1〜8)/
panels/colors/seam(継ぎ目の太さ・既定 8)/
merge(既定 0 で統合しない)/zIndex(既定 -10)
$ movo skill render split-screen --set columns=3 --set rows=2 \
--set merge=2.4 --duration 4 --width 640 --height 360 --fps 12 \
-f gif -o split-screen.gif
title-card — タイトルカード
帯が横に開き、その上にタイトルとサブタイトルが乗ります。帯を斜めの光が走り、
出たあともゆっくり呼吸します。align で左寄せと中央を選べます。
主な入力値
title(必須)/subtitle/
cardColor(既定 #1b2140)/titleSize(既定 96)/
align(left / center、既定 center)
$ movo skill render title-card --set title=Movo \
--set 'subtitle=JSON から動画をつくる' --set duration=3 \
--width 640 --height 360 --fps 12 -f gif -o title-card.gif
weather — 天候(雨・雪・桜)
舞い物を 1 行で足します。kind は rain / snow /
sakura / confetti / bubble の 5 種類で、
それぞれ速さ・大きさ・回り方が違います。tint の色を
オーバーレイで重ねて画面全体の色味も寄せられます。
舞い物が画面を埋めるまで数秒かかるので、この GIF は --from で頭を捨てています。
主な入力値
kind(既定 snow)/rate(既定 0 で種類ごとの既定値)/
tint(既定 #8fb8ff・空で無し)/
tintAmount(既定 0.16・0〜1)/duration(既定 6)
$ movo skill render weather --set kind=sakura --set tint='#ff9ec4' \
--set tintAmount=0.25 --set rate=90 --set duration=8 --from 4.5 \
--width 560 --height 315 --fps 10 --background '#2a1430' -f gif -o weather.gif
"scenes": [{ "use": [{ "skill": "title-card", "with": { "title": "Movo" } }] }]
"scenes": [{ "use": "mv-intro", "with": { "title": "入れ子の街", "bars": 4 } }]
"movie": { "use": "lyric-mv", "with": { "title": "夜明けまで", "bpm": 92 } }
"layers": [{ "type": "text", "text": "あ", "use": [{ "animation": "pop-in" }] }]
定義は 組み込み → プロジェクト固有の順に読まれ、後が優先されます。
同じ名前を <プロジェクト>/skills/*.json に置けば上書きできます。
«プロジェクトの根» は JSON のあるディレクトリです。
tmp/ に置いた JSON からは skills/ が見えないので、
根をずらしたいときは "project": { "root": ".." } と書きます。
movo skill new <名前> --scene で雛形が出ます。
入力の型は text / textList / number /
color / asset / enum / list です。
{
"skill": { "name": "chibi-stage", "kind": "scene", "title": "…" },
"inputs": {
"lines": { "type": "textList", "label": "歌詞", "default": ["…"] },
"bars": { "type": "number", "label": "尺(小節)", "default": 8, "min": 0.5, "max": 64 }
},
"scene": { "duration": "${bars}bar", "layers": [ ... ] }
}
${…} は別物です。
スキル定義の中の "${…}" は展開時に 1 度だけ評価され、
入力値や width / height / bpm が使えます。
{"expression": "…"} は毎フレーム評価され、
time / bpm / beatPulse(...) などが使えます。
展開時の値を実行時の式に埋めたいときは
{"expression": "${height * 0.6} - 14"} のように中に書きます。
レイヤー ID には ${_id}-… を付けてください。固定の ID を書くと、
同じスキルを 2 回使ったときに «重複 ID» で検証に落ちます。
文字には fit を付けると、長さの違う歌詞でも枠に収まります。
"fit": { "mode": "shrink", "maxWidth": "${width * 0.92}", "minSize": 0.3 }
$ movo analyze song.mp3 --json
BPM・1 拍目・小節・区間を推定します。WAV はそのまま読み、
mp3 などは ffmpeg があれば WAV に変換して読みます。
探す範囲は --min-bpm / --max-bpm(既定 60〜240)、
1 小節の拍数は --beats-per-bar(既定 4)です。
$ movo lyrics align song.mp3 --text lyrics.txt -o song.lrc
$ movo lyrics align song.mp3 --text lyrics.txt --anchor 1=5.4 --anchor 17=88.0
時刻の無い歌詞に 下書きの時刻を付けて .lrc にします。
歌詞は空行でブロックに割られ、繰り返すブロックはサビとして扱われます。
出るのは下書きなので、ずれていたら --anchor 行番号=秒 で
2〜3 点だけ留めてください。留めた点のあいだが配分し直されます(行番号は 1 始まり)。
$ movo make-mv song.mp3 --lyrics song.lrc --style hype-lyric-mv --jobs auto -o mv.mp4
--title / --lines | 曲名・歌詞(改行区切り) |
--lyrics <ファイル> | 時刻つきの歌詞(.lrc / .srt / .vtt / JSON) |
--asset 名前=パス | 画像などを素材として渡す(何度でも) |
--style <スキル名> | ムービースキル(既定 lyric-mv、激しいものは hype-lyric-mv) |
--intensity <0〜1> | 勢いの強い A メロを激しいシーンに寄せる(既定 0) |
--max-bars | 1 カットの上限(既定 8 小節) |
カット尺を 小節で決めるので、曲を差し替えればカット割りが追従します。
--lyrics を渡すと、小節数で機械的に配るのをやめ、
実際に歌われる時刻でカットへ割り当てます。
«なんとなく違う» を数字にして、直し方まで出すための仕組みです。 動画ファイルでもプロジェクト JSON でも測れます (JSON はその場で描いて測るので、書き出し前でも回せます)。
$ movo profile mv.mp4 --json
$ movo compare mv.mp4 --target profiles/kinetic-type.json
| 指標 | 見ているもの |
|---|---|
cutSeconds | カット尺(中央値) |
cutsPerMinute | 毎分のカット数 |
motion | 動きの量 |
stillRatio | 止まっている割合 |
colors | 実質の色数(全体の 90% を占めるのに要る色数) |
saturation | 彩度 |
contrast | 明暗の広がり |
detail | 細かさ(文字や模様の多さ) |
作風を «数値の範囲» で書いたものです。
<プロジェクト>/profiles/*.json に置くと名前で呼べます。
同梱は 10 種(movo list profiles)。
{
"name": "creator-yohaku",
"label": "切らない・低彩度・文字は小さく整列",
"target": {
"cutSeconds": [6, 30],
"cutsPerMinute": [2, 10],
"motion": [0.003, 0.022],
"stillRatio": [0, 0.8],
"colors": [8, 48],
"saturation": [0.05, 0.28],
"contrast": [0.1, 0.35],
"detail": [0.012, 0.045]
}
}
--target を名前で指定したときの探索は «その動画のあるディレクトリ» が基準です。
tmp/ に置いた動画から呼ぶときは、パスで渡すほうが確実です。
カットは 画面全体の明るさの変化で数えています (24 x 13 に縮めた輝度の格子で、平均差 0.18 以上を 1 カット)。 写真から別の写真へ切り替えても、どちらも同じくらいの明るさなら数えません。 低彩度の作風では特に起きます。対処は 2 つです。
compare が 8 / 8 でも «読めるか» は測っていません。
歌詞がキャラの体に重なって両方読めない、といったことは数値では出ません。
1 本につき 3 枚ほどフレームを抜いて見る手順を入れてください。
描く前なら movo frame が速いです。
--jobs は動画を区間に割り、別プロセスで描いて ffmpeg で繋ぎます。
再エンコードしないので画質は落ちません。auto でコア数 − 1 になります。
«同じ JSON からは同じ動画» が成り立つからこそ、フレーム境界で割れます。
$ movo render mv.json --jobs auto -o mv.mp4
-q draft | いちばん軽い。構成の確認に |
--from / --to | 時間範囲を切って描く |
-s <シーン id> | 1 シーンだけ描く |
--super-sample <1〜4> | アンチエイリアス倍率 |
--no-cache | キャッシュを使わない |
--lock | movo.lock.json を書き出す |
--variant / --all-variants | アスペクト比バリアント |
timeout コマンドを使わないでください。
強制終了と «子プロセスが落ちた» が同じメッセージになり、原因を取り違えます。
«失敗した» ことだけでなく «何で失敗したか» をスクリプト側で分けられるように、 エラーの種類ごとに違う値を返します。
| 値 | 意味 | エラー名 |
|---|---|---|
0 | 成功 | — |
1 | 上記以外の失敗 | — |
2 | 使い方の誤り | MOVO_CLI_USAGE |
3 | JSON が不正 | MOVO_SCHEMA_INVALID |
4 | 素材が見つからない | MOVO_ASSET_NOT_FOUND |
5 | 式が不正 | MOVO_EXPRESSION_INVALID |
6 | API キーの認証に失敗 | MOVO_PROVIDER_AUTH_FAILED |
7 | プラグインが無い/拒否 | MOVO_PLUGIN_NOT_FOUND |
8 | ffmpeg が無い | MOVO_FFMPEG_NOT_FOUND |
9 | メモリ不足 | MOVO_OUT_OF_MEMORY |
130 | 中断(Ctrl-C) | — |