在 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 验证工具