在 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 驗證工具