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.Status 是否爲 Error 來確認。

重要事項

場景內播放 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

如果文件存儲在應用的持久化數據路徑或其他應用私有路徑下,可以通過以下方式將文件導出到電腦上:

  • Android 平臺可以通過 USB 連接電腦後,使用 adb pull 或其他方式將文件導出到電腦上,文件通常在 /sdcarad/Android/data/<app package name>/files 下面。
  • iOS 平臺可以通過 Xcode 的 Devices 窗口將文件導出到電腦上,或者通過 iTunes 或 Finder 文件共享訪問應用的私有目錄。
  • 通過代碼將文件存儲到公共目錄下,比如 Android 的下載目錄或 iOS 的相冊等。
附註

對於 iOS 應用,如果希望通過 iTunes 或 Finder 文件共享訪問應用的私有目錄,在打包前需要在 XCode 項目的 Info.plist 中添加 UIFileSharingEnabled 鍵,並將值設置爲 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 插件中未集成相關功能,那些版本錄製的數據不能用於 Mega。

以下這些情況錄製的數據可以用於 Mega:

  • 使用 Unity 插件 4000 或更高版本錄製的數據
  • 使用 Mega Toolbox 錄製的數據
  • 如果數據是使用 Obsolete 格式錄製的,比如文件 x.eif,需要在文件相同目錄同時存在 x.eif.json 文件才能使用

以下這些情況錄製的數據不能用於 Mega:

  • 使用 Unity 插件 4.6 或更低版本錄製的數據
  • 使用原生 EasyAR Sense,且未添加與 Unity 插件中相同內容的數據

另外,雖然 Mega 可以不使用運動跟蹤進行工作,但運行效果是不一樣的。建議在錄製 EIF 文件時啓用運動跟蹤功能,從而保證播放時的效果能符合大部分使用場景。

後續步驟