Table of Contents

Unity で EIF ファイルを録画する

この記事では、シミュレーションで使えるように Unity で EIF ファイルを録画する方法を説明します。

始める前に

録画を開始する

録画を開始するには 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.StatusError かどうかを確認できます。

重要

シーン内で EIF を再生したときの実行結果は、録画に使ったデバイスとそのとき選んだ frame source に依存します。そのため、EIF を録画するときは、対象デバイスと同じか近いデバイスを使うことを推奨します。そうすることで、再生時の効果を対象デバイス上の効果と一致させやすくなります。また、録画時にシーンでモーション追跡機能が有効だったかどうかも重要です。録画時に有効でなかった場合、再生時にも有効にできず、モーション追跡に依存する AR 機能(たとえば密な空間マッピング、Mega など)もデバイス上と同じようには動作しません。

録画を停止する

FrameRecorder.enabled = false を使って録画を停止します。たとえば次のようにします。

frameRecorder.enabled = false;

この操作は即座に録画を停止し、ファイル書き込みが完了するまでブロックします。

重要

必ず録画停止を呼び出してください。呼び出さないと録画ファイルが不完全になり、一部機能またはファイル全体が使えなくなります。

  • 録画形式が H264 の場合、EIF ファイルは再生中に指定時刻へ移動(seek)できず、先頭からしか再生できません
  • 録画形式が Obsolete の場合、EIF ファイルは使えません

ファイル保存と書き出し

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 のチェックを外して設定できます。

alt text

ヒント

FrameRecorder.RecordingConfiguration.FilePath で保存先ディレクトリとファイル名(拡張子なし)を変更できます。ファイル拡張子は録画形式に応じて自動で追加されます。

  • 録画形式が H264 の場合、拡張子は .mkveif
  • 録画形式が Obsolete の場合、拡張子は .eif

ファイルがアプリの永続データパスやその他のプライベートパスに保存される場合、次の方法で 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.plistUIFileSharingEnabled キーを追加し、YES に設定する必要があります。

alt text

追加後に表示される文字は、入力した文字列とは異なりますが正常です。

録画形式を変更する

FrameRecorder.Configuration.Format で録画形式を変更します。これは録画開始前に設定する必要があります。

たとえば、次のコードは録画形式を H264 に強制します。

frameRecorder.Configuration.Format = FrameRecorder.InternalFormat.H264;

エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウで Format を変更できます。

alt text

注記

H264 は一部のデバイス(たとえば Windows)では使用できません。通常は Auto を推奨します。これはデバイスに応じて適切な形式を自動選択します。

注記

XREAL では、Obsolete 形式で録画したデータはシミュレーション実行に使えません。この形式は問題報告専用です。

  • シミュレーションには H264 形式で録画したデータを使用してください。
  • 問題報告には Obsolete 形式で録画したデータを使用してください。

RecordingFormat で現在の録画形式を確認できます。

session 起動時に自動録画する

session 起動前に AutoStarttrue に設定すると、session 起動時に録画を開始できます。たとえば次のようにします。

frameRecorder.AutoStart = true;

エディタでも、AR Session (EasyAR) を選択し、Inspector ウィンドウで Frame Recorder の Auto Start にチェックを入れられます。

alt text

注記

エディタ上で 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 ファイルを録画するときはモーション追跡機能を有効にすることを推奨します。そうすることで、再生時の効果を多くの利用シナリオに適合させられます。

次のステップ