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 檔案時啟用運動跟蹤功能,從而保證播放時的效果能符合大部分使用場景。

後續步驟