在 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 可以修改文件的存儲目錄和文件名(不含擴展名),文件擴展名會根據錄製格式自動添加。
如果文件存儲在應用的持久化數據路徑或其他應用私有路徑下,可以通過以下方式將文件導出到電腦上:
- 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:

添加之後顯示的文字與添加的字符串不同,這是正常的。
更換錄製格式
通過 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 插件中未集成相關功能,那些版本錄製的數據不能用於 Mega。
以下這些情況錄製的數據可以用於 Mega:
- 使用 Unity 插件 4000 或更高版本錄製的數據
- 使用 Mega Toolbox 錄製的數據
- 如果數據是使用 Obsolete 格式錄製的,比如文件
x.eif,需要在文件相同目錄同時存在x.eif.json文件才能使用
以下這些情況錄製的數據不能用於 Mega:
- 使用 Unity 插件 4.6 或更低版本錄製的數據
- 使用原生 EasyAR Sense,且未添加與 Unity 插件中相同內容的數據
另外,雖然 Mega 可以不使用運動跟蹤進行工作,但運行效果是不一樣的。建議在錄製 EIF 文件時啓用運動跟蹤功能,從而保證播放時的效果能符合大部分使用場景。
後續步驟
- 嘗試 使用 EIF 文件模擬運行
- 嘗試 使用 session 驗證工具