Unity で EIF ファイルを録画する
この記事では、シミュレーションで使えるように Unity で EIF ファイルを録画する方法を説明します。
始める前に
- EIF ファイルを録画してシミュレーションに使う の基本概念
- AR Session の基本概念、構成、ワークフロー
- session 内の AR 機能コンポーネントにアクセスする ことで録画コンポーネントへのアクセス方法を理解する
録画を開始する
録画を開始するには FrameRecorder.enabled = true を使います。たとえば次のようにします。
if (Session.State >= ARSession.SessionState.Ready && Session.Assembly.FrameRecorder.OnSome)
{
var frameRecorder = Session.Assembly.FrameRecorder.Value;
frameRecorder.enabled = true;
}
ここでは、まず ARAssembly.FrameRecorder が存在するかどうかを確認する必要があります。
注記
ARAssembly.FrameRecorder は一部のケースでは使えません。たとえば FramePlayer を使っている場合です。
FrameRecorder.enabled の既定値は false で、録画は無効です。エディタで手動設定しても効果はありません。
録画は、session 実行中に FrameRecorder.Status >= FrameRecorder.RecorderStatus.Ready になったときに開始されます。
FrameRecorder.Status < FrameRecorder.RecorderStatus.Ready の場合は、OnReady イベントを使って録画準備完了を待てます。
Session.GetComponent<FrameRecorder>().OnReady.AddListener(() => {
// 録画を開始できる
});
録画開始の成功確認には OnRecording イベントを使えます。
frameRecorder.OnRecording.AddListener((file) =>
{
Debug.Log($"Recording started: {file}");
});
開始に失敗してもイベントは発火しませんが、FrameRecorder.Status が Error かどうかを確認できます。
重要
シーン内で EIF を再生したときの実行結果は、録画に使ったデバイスとそのとき選んだ frame source に依存します。そのため、EIF を録画するときは、対象デバイスと同じか近いデバイスを使うことを推奨します。そうすることで、再生時の効果を対象デバイス上の効果と一致させやすくなります。また、録画時にシーンでモーション追跡機能が有効だったかどうかも重要です。録画時に有効でなかった場合、再生時にも有効にできず、モーション追跡に依存する AR 機能(たとえば密な空間マッピング、Mega など)もデバイス上と同じようには動作しません。
録画を停止する
FrameRecorder.enabled = false を使って録画を停止します。たとえば次のようにします。
frameRecorder.enabled = false;
この操作は即座に録画を停止し、ファイル書き込みが完了するまでブロックします。
重要
必ず録画停止を呼び出してください。呼び出さないと録画ファイルが不完全になり、一部機能またはファイル全体が使えなくなります。
ファイル保存と書き出し
OnRecording イベントを使って、録画ファイルの完全な実パスを取得できます。
frameRecorder.OnRecording.AddListener((file) =>
{
Debug.Log($"Recording started: {file}");
});
既定では、録画ファイルはアプリの永続データパスに保存されます。これは Application.persistentDataPath でアクセスできます。
FrameRecorder.Configuration.FilePath で保存先を変更できます。このパスは録画開始前に設定する必要があり、AutoFilePath をオフにして初めて有効になります。事前にディレクトリを作成しておいてください。
重要
録画ファイルの保存先ディレクトリが存在し、アプリが書き込めることを必ず確認してください。そうでないと録画開始に失敗します。
たとえば、次のコードは録画ファイルを任意のディレクトリに保存し、session で使われる FrameSource の型と現在時刻に基づいてファイル名を生成します。
if (!Directory.Exists(SavePath))
{
Directory.CreateDirectory(SavePath);
}
var frameRecorder = Session.Assembly.FrameRecorder.Value;
frameRecorder.Configuration.AutoFilePath = false;
frameRecorder.Configuration.FilePath.Type = WritablePathType.Absolute;
frameRecorder.Configuration.FilePath.FolderPath = SavePath;
frameRecorder.Configuration.FilePath.FileName = ARSessionFactory.DefaultName(Session.Assembly.FrameSource.GetType()).Replace(" ", "") + DateTime.Now.ToString("_yyyy-MM-dd_HH-mm-ss.fff");
frameRecorder.enabled = true;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウで Frame Recorder の Auto File Path のチェックを外して設定できます。

ヒント
FrameRecorder.RecordingConfiguration.FilePath で保存先ディレクトリとファイル名(拡張子なし)を変更できます。ファイル拡張子は録画形式に応じて自動で追加されます。
ファイルがアプリの永続データパスやその他のプライベートパスに保存される場合、次の方法で PC に書き出せます。
- Android では USB で PC に接続し、
adb pullなどでファイルを書き出します。通常は/sdcarad/Android/data/<app package name>/filesにあります。 - iOS では Xcode の Devices ウィンドウからファイルを PC に書き出すか、iTunes / Finder のファイル共有でアプリのプライベートディレクトリにアクセスできます。
- コードで公開ディレクトリに保存します。たとえば Android のダウンロードフォルダや iOS の写真などです。
注記
iOS アプリで iTunes / Finder のファイル共有を使ってアプリのプライベートディレクトリにアクセスしたい場合は、パッケージ化前に Xcode プロジェクトの Info.plist に UIFileSharingEnabled キーを追加し、YES に設定する必要があります。

追加後に表示される文字は、入力した文字列とは異なりますが正常です。
録画形式を変更する
FrameRecorder.Configuration.Format で録画形式を変更します。これは録画開始前に設定する必要があります。
たとえば、次のコードは録画形式を H264 に強制します。
frameRecorder.Configuration.Format = FrameRecorder.InternalFormat.H264;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウで Format を変更できます。

注記
XREAL では、Obsolete 形式で録画したデータはシミュレーション実行に使えません。この形式は問題報告専用です。
RecordingFormat で現在の録画形式を確認できます。
session 起動時に自動録画する
session 起動前に AutoStart を true に設定すると、session 起動時に録画を開始できます。たとえば次のようにします。
frameRecorder.AutoStart = true;
エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウで Frame Recorder の Auto Start にチェックを入れられます。

注記
エディタ上で FrameRecorder.enabled を変更しても無効です。
Mega で使えるデータ
Mega を使う場合、EIF と関連ファイルには特別な要件があります。古い Unity plugin ではこれらの機能が含まれていなかったため、それらのバージョンで録画されたデータは Mega では使えません。
次の条件で録画されたデータは Mega で使えます。
- Unity plugin 4000 以上で録画されたデータ
- Mega Toolbox で録画されたデータ
- データが Obsolete 形式で録画されている場合、たとえば
x.eifなら、同じディレクトリにx.eif.jsonが必要です
次の条件で録画されたデータは Mega で使えません。
- Unity plugin 4.6 以下で録画されたデータ
- Unity plugin と同じ内容を追加していない native EasyAR Sense で録画されたデータ
また、Mega はモーション追跡なしでも動作できますが、結果は異なります。EIF ファイルを録画するときはモーション追跡機能を有効にすることを推奨します。そうすることで、再生時の効果を多くの利用シナリオに適合させられます。