[UE5] Movie Render Queue のコマンドラインエンコーダでBinkエンコーダを試してみたかった。

2022/10/19に公開

UE4終盤にMovie Render Queueというのが搭載されました。
シーケンサーでの動画・連番レンダリングをジョブとして積んでまとめて実行できます。

各種書き出し形式にまぎれて「コマンドラインエンコーダ」というのが用意されていて

ここではその使い方を調べたときのメモを書いていきたいと思います。

環境は UE5.1 Preview 1
Windows 10 21H1 です。

コマンドラインエンコーダについて

コマンドラインエンコーダについて公式ドキュメントではこのあたり▼で解説されています。
https://docs.unrealengine.com/5.0/ja/cinematic-rendering-export-formats-in-unreal-engine/#commandlineencoder
このドキュメントではffmpeg.exeの使用を念頭に書かれており、多分それで使うケースがほぼ100%かと思いますが
ここではffmpegを入手する手間を省略して、UE5に同梱されているエンコーダ 「Bink」 を使ってみたいと思います。

Binkについて

BinkはUE5のロードマップを見て初めて知ったのですが、4K/HDR/Alphaチャンネル対応、これまで15000タイトルに採用されてきた老舗コーデックなようです。

https://portal.productboard.com/epicgames/1-unreal-engine-public-roadmap/c/528-cross-platform-bink-video-codec

以下にexeが置かれています。

UE_5.1\Engine\Binaries\ThirdParty\Bink\Bink2ForUnreal.exe

今回はコマンドプロンプトに入れて使いますが、普通にダブルクリックするとこのようなUIが起動します。

準備

プラグインを有効にしてプロジェクトを再起動

よしなにシーケンスを作ります。

そして一旦jpg連番でレンダリングしておきましょう。

ちなみに、出力に「{year}{month}{day}」といったフォーマット文字列を入れておくと便利です。

Binkのコマンドを確認

Bink2ForUnrealをコマンドラインツールとしてどのように使うかを確認していきます。
cmdで下記のように実行してみると

Bink2ForUnreal.exe /?


このように、いくつかのツールに分かれている旨が案内されます。
今回は連番から動画への圧縮に使いたいので、Bink2cについてさらにヘルプしてみます。

Bink2ForUnreal.exe Bink2c /?

すると、いくつかのダイアログが立て続けに現れます。



(テキストでプリントしてくれた方がコピペできてありがたいのですがなぜ)

ともあれ、これらの内容をもとに、
まずは先ほど出しておいた連番を使ってBink2ファイル(.bk2)を作ってみます。
このようにしてみました。今回は音声関連は含めていません。

Bink2ForUnreal.exe Bink2c "path\to\images.????.jpeg*0-149" "path\to\export.bk2" /f30.0 /v200+8192

連番の指定の仕方が非常に特徴的で、「????」が連番の桁数(ゼロパディング込み)で、「*」を挟んで「0-149」のように開始フレーム・終了フレームの番号を指定します。

実行すると、進捗UIが現れます。

どういうコマンドで連番からbk2を作れるかがわかったので、
次に、冒頭に挙げたコマンドラインエンコーダのドキュメントに沿ってUE側を設定していきます。

設定

プロジェクト設定

プロジェクト設定の左欄から「Movie Pipeline CLI Encoder」を探します。
(Movie Render Queueは内部的にはMovie Pipeline / Movie Render Pipeline と呼ばれているようです)

ffmpeg用と思しき内容がある程度入力されています。
それぞれの欄に入っている内容は以下です。

Command Line Format

-hide_banner -y -loglevel error {AdditionalLocalArgs} {VideoInputs} {AudioInputs} -acodec {AudioCodec} -vcodec {VideoCodec} {Quality} "{OutputPath}"

Video Input String Format

-f concat -safe 0 -i "{InputFile}" -r {FrameRate}

Audio Input String Format

-f concat -safe 0 -i "{InputFile}"

まず Executable Path にBink2ForUnreal.exeのパスを入力し、
Output File Extension には拡張子bk2と入れておきます。

Command Line Format の中の{VideoInputs}・{AudioInputs}に、Video Input String Format欄・Audio Input String Format欄の内容がそれぞれ入力されるとのこと。

今回は音声関係はスルーするためオーディオコーデックやオーディオインプットは関係ないのですが、
オーディオコーデックは使わなくても入力必須なようです。
ただ、空欄でなければ問題内容で、適当にwavとでも入れておきます。

また、には次のように入力しました。

{VideoCodec} {VideoInputs} {OutputPath} /f{FrameRate} /v200+8192 {AdditionalLocalArgs}

{AudioInputs}、{AudioCodec}、{Quality}は省略しています。
……例の特徴的な連番の入力しようがないので、不穏な空気が漂います。

Movie Render Queue の設定

次にMRQ側の設定です。

jpg連番とコマンドラインエンコーダーを併用しています。
これにより、レンダリング結果はまずjpg連番として保存され、
それからコマンドラインエンコーダによってエンコードされます。
今回は試していませんが、動画に音声トラックを組み込む場合はwav書き出しも追加しておきます。

「File Name Format Override」に入っている「{sequence_name}」は、コマンドラインエンコーダのエンコード結果(今回はbk2ファイル)のファイル名に使われます。
jpg連番のファイル名には「{sequence_name}.{frame_number}」とフレーム番号が入りますが、それをエンコードした動画ファイルのファイル名にフレーム番号が含まれると齟齬をきたしてしまうため、これを上書きするのに使う欄です。

Delete Source File をONにしておくと、コマンドラインエンコーダにとってのソースファイル=jpg連番がエンコード後に消去されます。

設定がひととおり出来たら、MRQ右上の「プリセットのロード/保存」メニューから
「プリセットとして保存」しておきましょう。

MRQは設定を一時的には覚えてくれますが、プロジェクトを閉じたら失われてしまうため、ファイルとして明示的に保存しておく必要があります。
(もし多くの人がプリセットを保存する状況なら、命名規則を決めておいたほうがよいかと思います)

レンダリング -> 失敗

設定が済んだらMRQ右下の「レンダリング(ローカル)」をクリックしてレンダリングを開始します。

jpg連番までは無事出力されますが、
コマンドラインエンコーダに関しては失敗します。

失敗すると、binkの書式に沿ってないということで前掲のダイアログが警告音付きで現れます。
ご丁寧にダイアログ三枚とも出るのでちょっとイラっとします。

失敗コマンドを確認

コマンドラインエンコーダが何を実行したのか、ログを確認してみます。

LogMovieRenderPipelineIO: Generated Path '(略)/Saved/MovieRenders/20221018/82B9A4354E58FF2809867A9831433A52_input.txt' for input data.
LogMovieRenderPipelineIO: Final Command Line Arguments: Bink2c  "(略)/Saved/MovieRenders/20221018/82B9A4354E58FF2809867A9831433A52_input.txt" (略)/Saved/MovieRenders/20221018/LS_MRQTest.bk2 /f30.000000 /v200+8192 

懸念していた通り、{VideoInputs}の箇所には例の書式のような連番が入りませんでした。
代わりに「{guid}_input.txt」というファイルが渡されていますが、これはエンコード対象になるファイルのリストです。
binkもファイルリストを受け取ることはできるのですが、その場合の拡張子は「.LST」である必要があるとのこと。
またファイルリストの中身も

file 'file:{ファイル名}'

という書き方になっており、シンプルにファイル名がリストされたものではないようです。

いろいろな理由で失敗するべくして失敗した形ですね。

対応

{guid}_input.txtファイルの出力は

UE_5.1\Engine\Plugins\MovieScene\MovieRenderPipeline\Source\MovieRenderPipelineCore\Private\MoviePipelineCommandLineEncoder.cpp


に書かれているので、binkが喜ぶようなファイルリストが出力されるようにしたら
うまくいく気がします。試してはいませんが。

その他

このように、MRQは比較的新しいため色々できそうでできないこともあったり、UE5からbinkが同梱されるようになったとはいえまだ高い水準で使い勝手が練られているというわけではなさそうです。
今後の5.xアップデートの中でいい感じになることを期待しています。

また同様に、UEのドキュメントも過渡期であり、たとえば冒頭に挙げたエクスポート形式のページも
https://docs.unrealengine.com/5.0/ja/cinematic-rendering-export-formats-in-unreal-engine/#commandlineencoder
2022/10/18現在はまだ「This page was written for a previous version of Unreal Engine and has not been updated for the current Unreal Engine 5.0 release.」と書かれており、記述が必ずしもUE5の内容に沿ったものではありません。
世のUE5について書いたブログなども、この記載を見落として「UE5の解説と見せかけてUE4の作法を紹介している」ということがまれによくあるので、しばらくはドキュメントを読む際の注意が必要そうです。

Discussion