ComfyUIのSBS出力を簡易なVR動画に

ComfyUIからは2025年1月現在、今のPCでだいたい1024 x 1024 または1280 x 768程度の3D SBS画像を生成することができる。本来ならこれをAdobe Premiereあたりで編集して動画を作成するのが筋なのだがこのサイズだとエンコードしてデバイスに出力してくれない。そこで簡易にFFmpeg + ステレオムービーメーカを活用してVR動画を作るシナリオをかんがえたので、下記に記す。

想定:
1)画像は3D静止画をパラパラと見せる。1枚3秒程度見せる。
2)タイトルや途中のテキストは、独立した画像で見せることとし、3D_SBSの中には埋め込まない
3)音声や画像はまとめて一つの音源として作成し、これもFFmpeg中にまとめる

やり方案:
1)最初に1024 x 1024 x 2面(=2048 x 1024) のテンプレート面をpngなどで作成する。
2)これを使って
・タイトル
・テキストのみのページ
・他のコンテンツ(人物の様子など)
・エンディング
などを最初に作っておく
3)静止画はあらかじめ連番で作成しておく。シナリオに沿って1)で作成したページもこの時点で入れて連番にしておく。静止画の1枚の継続時間を想定(例えば4秒)しておく。
4)Adobe Premiereを使って静止画を読み込み、それに合わせて音声シナリオ、背景音楽を編集する。継続時間を考慮する。できたら、全部の書き出しはできないので音声と音楽のみまとめてmp3などで出力する。
5)静止画の中にテキストを盛り込みたいページがあれば、ステレオフォトメーカで編集して挿入する
6)FFmpegでエンコードする。
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4
-framerate 30 は1秒あたり30フレームの動画を指定しています。frame_%04d.png はSBS画像ファイル名の形式(例: frame_0001.png, frame_0002.png など)。output.mp4 は出力動画ファイルの名前です。
7)音声もincludeする際には
ffmpeg -framerate 30 -i frame_%04d.png -i audio.mp3 -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4

output.mp4 出力動画のファイル名。ate 30動画のフレームレートを指定(30FPSに設定)。
-i frame_%04d.png入力画像(連番形式)の指定(例: frame_0001.png, frame_0002.png)。-i audio.mp3入力音声ファイル(MP3ファイルを指定)。
-c:v libx264 動画コーデックを指定(H.264で圧縮)。
-pix_fmt yuv420 動画のピクセルフォーマットを指定(互換性向上のための設定)。
-c:a aac音声コーデックを指定(AAC形式に変換)。
-shortest 音声と画像の短い方に合わせて動画を終了させるオプション 

これで見ることができるはずと期待


ポートレート3D映像の作り方

2023現在、Fijifilm 3Dで撮影した映像を利用してOculusで視聴できる画像で今のところ満足できる作成法は以下の通り。

ターゲットのモデルはPoserで作成し、Octane renderでParallel & SBS、視差は60mm程度で作成する。特にカメラの焦点距離を40mm程度にする。pngで出力する。サイズは960 x 1280の横つながりなので1920 x 1280とする。Parallelで作成するとボディが前面に浮き出た感じになる。

一方3Dカメラの画像は左右とも3584 x 2016である。ステレオフォトメーカProを使ってこれをリサイズ &トリミングする。もしもポートレートから後ろに遠ざけたいのであれば、画面を目いっぱい切り抜けばよいので、まず縦横比を維持しつつ高さを1280として縮小し、その後に960 x 1280でトリミングすればよい。逆にポートレートに近づけたい場合には高さを1280から2016の範囲で適当にセットし、縦横比を維持して縮小し、その後に960 x 1280でトリミングすればよい。これをjpgでステレオ出力(S=SBS)する。1920 x 1280の画像が出力される。

Photoshopを用いて、3Dカメラの背景画像を読み込み、合わせてレイヤを用いてモデルのpng出力を重ねる。Tipsとしてこのpngの右上/左下に小さな四角画像を入れておくと、コピペして背景画像と重ねる際にうまくゆく。後でこれは消す。

重ねの常で、モデルのレイヤでレイヤのフリンジ除去を行った後、背景とのバランスで、明るさやコントラストを調整してゆく。背景をぼかしたり、他のエフェクトをつけることも可能だ。

出来上がった3D SBSファイルは、jpgで保存する。オプションとして、再度ステレオフォトメーカProを使ってロゴやテキストを入れることもできる。Parallelを使ってボディを前面に出す場合には文字の深さは+40ピクセル程度、ロゴも30ピクセル程度にした方がよい。

これでOculusでも他のVRででも素敵な立体画像視聴が可能となる。


StereoPhotoMakerで深度調整

SBSを読み込ませたのち、調整->簡単位置調整を選択する。

水平選択でとして、
左 ++ 右 — => 画像が前面に押し出される
左– 右++ => 画像が後方に引っ込む

Octaneで立体SBSができたら、これで調整し、PNGで書き出したのち、3D写真と

合成するとよい

追記:一発調整を行うと、例えばParallelで前面に画像を出そうとしても真ん中あたりに平均化されてしまうようだ。使わないほうが無難なようだ


3D octane(続き)

Fuji fine-pixで撮影した3D映像に、octaneで作成した3D SBSを重ねている。
もしfine-pixでの立体よりも前面にモデルを出したいときは平行法(Parallel)を用いるとよい。
一方もしfine-pixの立体よりもモデルを後ろに回したいときは、モデルを下がらせて
その分focusを上げるという手もあるが、さっさと交差法でレンダしたほうがうまくゆくことが多い。

またfocusは35mmでは立体感が強調されすぎるし、100-150mmではべたっとなる。60mmぐらいが適切かと思うがそれは場合場合で調節すると良いと思う

補足:少々upで近傍の3Dを表現するには40mmでもまだ立体感が強調されている。55mmにしたら割とよかった


Fuji Film 3D camera & Poser

名残惜しいFuji Film finePix read 3D(以降 F3Dといいます)、これを使ってMPOファイルから左右別々の画像を抽出する。FR.jpg, FL.JPGとしよう。このサイズはそれぞれ3441×2016である。さてこの画像とPoser & Octaneで生成される3D画像を重ねてVRで3Dに見せられる画像を作ってみたい。

1)まずこの現画像2つを圧縮し、1280 x 750 2枚にする。

2)Poserにて作られた画像をOctaneで3D化する。このとき、Octaneで作成する画像のサイズも1280 x 750の左右2枚とする。Off-Axisで生成する。視差は0.065ぐらいでいいだろう。PoserのFocalはまだ調整が必要だが、35mm-25mmの間ぐらいがよさそう。
->いろいろ試したが、35mmと50mmの間、42.5mmぐらいが妥当そうだ。

3) 1), 2)をPhotoshop上で合成してpngもしくはjpgで出力する。サイズが同じなので問題なくできるはず

4) Stereo Photo Makerでこの2枚を順に読み込み、MPOにする。

5)Oculesで視聴する VR Photo Player はMPOが見られる

追記:VR Photo Playerで見るとかなり画面が大きい。Poserで作成したフィギュアは比較的画面の下に収め、かつ背景の上部は大きく空があるほうがよさそうである。


Oculus riftで.mpoファイル閲覧

Oculus riftで.mpo閲覧したいと思ったが、なかなか見つからなかった。LiveViewRiftで見れるとあったが、どうもステレオ画面になってくれない。他の候補をあたってみるにSteam上のVR Photo Viewerがあった。これは動作が鈍いので、選択に時間がかかるが、コントローラで右のBボタンを押せばファイル選択ならびにSBS, MPOなどの設定が出る。これで何とか.MPOファイルが見れるようになった。ただしデフォルトが横に延伸したビューなので、そうでない普通のビューがデフォルトになってほしい。


Poser & Octane2.0で3Dムービー

先にOctane2.0で3D(立体)Poser静止画作成を書いたが、今回は3D movie作成について述べる。最後の出力は、裸眼で立体視が可能なFujifilm Finepix real 3Dディスプレイを想定している。

  • まずPoserでアニメーションを作成する。これは通常通り。但し最後の出力を考え、フレームのサイズは1280×720にしておく。
  • 続いてOctaneRenderを3D設定する。stereoModeは静止画と同じく交差法(Off-Axis)で他はdefaultでよい。resolutionを先ほどと同じく1280×720にしておく。stereoOutputをRight/Leftに指定し、それぞれ1回ずつレンダリングすることになる。
  • OctaneRenderでAnimationを開く。Start FrameとEnd Frameを指定する。ここではMaximum Render Time per Frameを指定できるので、1コマあたりレンダリングに最大何秒掛けてよいかを見積もって入力する。たとえば30コマのレンダリングを1時間で終わらせたければ左右30分ずつなので、1コマあたりのレンダリングは60秒となる。他はほぼデフォルトで良い。Render Animationを押すとレンダリングが開始される。
  • 終了したら、Left/Rightを入れ替えて再度作成する。このときOutput Folderの中の結果を退避させておかないと上書きされるので注意。
  • 出来上がった左右のpng静止画群から左右別々のムービーを作成する。今回はAdobe Premiere10を使って作成したのでこれに沿って説明する。新しいプロジェクトを作成し、左の静止画を全部読み込む。続いてこれらを全選択し、ビデオ1のタイムラインにドラッグする。時間を調整するために、先頭画像を右クリックでタイムストレッチを選び、適切な値に設定する。一つ変えると全部の画像のタイムストレッチが変化する。
  • Premiereで書き出し-コンピュータ-MPEGを選択。プリセットはとりあえずHD720p 25にした(25はPALなので30 NTSCにすべきだったのかも知れない)。xxxL.mpgのような左MPEG動画を作成する。同様に右の静止画も新たに全部読み込んでxxxR.mpgを作成する
  • ステレオムービーメーカーをダウンロードする。これでファイル-左右ムービーを開く、で先ほどのxxxL.mpg, xxxR.mpgを読み込ませる。AVIの種類によってはこの段階で読めないケースも多く、そのため先ほどのPremiereでHD720pを選択している。ここで他の動画も読めるようなら、Premiereでなく、他のフリーソフトでの動画作成も大丈夫だろう。
  • ステレオムービーメーカーで、位置調整-左右位置自動調整を選択し、位置を調整する。このあと再生(G)-再生(同期確認)などで、うまく再生できていることを確認する。
  • ファイル-3D-AVI形式で保存、を選択しターゲットファイル名を入力して3D-AVI形式の動画を作成する。パラメータとしてFinepix real 3Dの1280×720を選択。ただしこの作成段階でプログラムが異常終了することがある。何度か試すしかない。
  • 出来上がったファイルをUSBメモリに移し、Fujifilm Finepix real 3Dディスプレイに装着して動画を選択すると、リアルな3D(立体)動画が現れる。以上出来上がると、なかなか感動モノだ。

  • Octane Render2.0で3D CG

    Octane Render2.0になってPoser の出力を3Dの独立の画面として出力することができるようになった。こうして出力される2枚の画像をステレオフォトメーカーなどでステレオ化すれば、3Dテレビなどで3D画像を映すことが可能になる。

    ここでは、3D画像を裸眼で手軽に見られるディスプレイとしてFujifilm Finepix Real3D Displayを利用することとし、さらにFujifilm Finepix Real3D W3Sの立体カメラで写した画像との重ね合わせを行うためのパラメータチューニングをしてみた。

    まず基本は、本Displayに表示させるときにはOctane RenderをOff Axisモードにする。そして視差間隔を0.06(デフォルト0.02)程度にする。間隔を広げるとRender出力の立体感が増すがあまり広げると目が疲れる。

    スペックによるとW3Sは標準で撮影して35mmカメラ相当からズームを行うと105mm相当の範囲でFocalが変化するようだ。35mmの標準で撮影した写真を背景にすると、Poser側もほぼ35mmのスペックでよさそうに見える。しかしよりリアリティを出すには、若干Poserで設定する距離を長めに、そしてFocalを大きめにしたほうがよさそうだ。10数回カット&トライを行ってみたが、Poserにおいてカメラから本当なら1.8mを想定しているときには、約倍の3.6mぐらいにオブジェクトとの距離を置き、代わりにfocalを35mmから60mm程度に広げ、オブジェクトを拡大させたほうが、よりリアルに映った。

    今後さらにチューニングを進めたい。