Remotionで長い動画のレンダリングがクラッシュする──分割レンダとffmpeg無劣化連結で完走させる手順
Remotionで20分超・数万フレーム級の動画をレンダリングすると、ヘッドレスブラウザのメモリ枯渇で終盤にクラッシュすることがあります。concurrencyを絞る方法と、--framesで区間を分割レンダしてffmpegのconcatで無劣化連結する再開可能な手順を、22分動画を完走させた実体験から解説します。

目次
Remotion(Reactで動画を作るフレームワーク)で20分超・数万フレーム級の動画をレンダリングすると、途中でプロセスが落ちることがあります。原因の多くはヘッドレスブラウザのメモリ枯渇です。この記事では、①並列数(concurrency)を絞る、②フレーム区間を指定して分割レンダし、完走した区間だけ確定保存して再開可能にする、③最後にffmpegのconcatで再エンコードなしに連結する、という実践的な完走手順を説明します。
- 長尺レンダのクラッシュはメモリ枯渇が主因。まず並列数を下げて様子を見る
- それでも落ちるなら
--framesで区間分割レンダ。完走した区間は確定保存し、落ちた区間だけやり直す- 連結はffmpegのconcat(
-c copy)で無劣化。中間ファイルは必ず.mp4拡張子にする
なぜ長い動画だとクラッシュするのか
Remotionはヘッドレスブラウザ(画面を表示しないブラウザ)でコンポジションを描画し、フレームを書き出します。動画が長くなるほどレンダリング時間とメモリ使用量が積み上がり、並列で複数のフレームを描画している分、メモリ逼迫時にはプロセスごと落ちます。厄介なのは、終盤で落ちるとそこまでの処理がすべて無駄になる点です。対策は「メモリ消費を抑える」か「落ちても被害を区間内に閉じ込める」の二方向で、以下のA案・B案がそれぞれに対応します。
A案: まず並列数(concurrency)を絞る
Remotionのレンダリングは複数プロセスを並列で走らせます。公式ドキュメントによると、デフォルトはCPUスレッド数の半分です。並列数を下げればピークメモリが下がるので、最初に試す価値があります。
npx remotion render MyComp out/video.mp4 --concurrency=2
レンダリング時間は伸びますが、完走しないよりはるかにましです。ただし、動画そのものが長い場合はこれだけでは足りないことがあります。その場合はB案に進みます。
B案: フレーム区間を指定して分割レンダする
--frames オプションで「どのフレームからどのフレームまで」を指定してレンダリングできます(公式ドキュメント記載の機能です)。動画全体をいくつかの区間に割り、1区間ずつレンダリングします。
npx remotion render MyComp out/part_00.mp4 --frames=0-7999
npx remotion render MyComp out/part_01.mp4 --frames=8000-15999
# 以降も同様に続ける
この方式の要点は、完走した区間のファイルをその場で確定保存することです。途中でクラッシュしても、失うのは走っていた区間だけで、そこからやり直せば済みます。事実上の「再開可能なレンダリング」になります。
注意点がひとつ。中間ファイルの拡張子は必ず.mp4にしてください。Remotionは出力ファイル名の拡張子を検証するため、仮の名前のつもりで別の拡張子を付けるとエラーになります。
分割したファイルをffmpegで無劣化連結するには
区間ファイルがそろったら、ffmpegのconcat demuxer(複数ファイルを順番につなぐ機能)で連結します。まず連結リストのテキストファイルを作ります。
file 'part_00.mp4'
file 'part_01.mp4'
そして -c copy(再エンコードなしのストリームコピー)で連結します。
ffmpeg -f concat -i list.txt -c copy final.mp4
FFmpeg公式ドキュメントにあるとおり、-c copy はデコードも再エンコードもしないため高速で、画質の劣化がありません。同じコンポジションを同じ設定で書き出した区間ファイル同士なら、コーデックや解像度がそろっているのでこの方式が使えます。パスの書き方によっては -safe 0 オプションが必要になる場合があります。
筆者の現場から
22分の解説動画をRemotionでレンダリングした際、終盤でのクラッシュが連発しました。何度やり直しても最後まで届かないため、8000フレームずつの分割レンダに切り替え、完走した区間だけ保存して落ちた区間をやり直す方式で完走させました。連結は再エンコードなしのconcatで行いましたが、継ぎ目は視聴上分かりませんでした。
正直な但し書き
- クラッシュの閾値はマシンのメモリ量、コンポジションの内容(画像サイズ、エフェクトの重さ)、OSの状況に依存します。この記事の手順で必ず完走できるとは言えません
- 分割の区間長に正解はありません。筆者の8000フレームは一例で、環境によって適切な値は変わります
- concat連結は区間ファイル同士のコーデック・解像度・フレームレートがそろっていることが前提です。設定を変えて書き出した区間が混ざると失敗します
- Remotionには有償のクラウドレンダリング(Lambda等)もあり、そちらで解決する選択肢もあります。本記事はローカル環境で完走させたい場合の手順です
出典
- npx remotion render | Remotion公式ドキュメント —
--framesによる区間指定、--concurrencyの仕様 - Performance Tips | Remotion公式ドキュメント — 並列数とレンダリング性能の公式ガイド
- FFmpeg Formats Documentation — concat demuxerの仕様
出典・参照資料
AIニュースの解説を動画でも
YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。
コメント
まだコメントはありません。最初のコメントを書いてみませんか?
AIについて聞きたいことはありますか?
質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。
質問箱を見る →