Запись файлов EIF в Unity
В этой статье объясняется, как записывать файлы EIF в Unity, чтобы использовать их для симуляции.
Перед началом
- Базовые понятия записи файла EIF и его использования для симуляции
- Базовые понятия, состав и workflow AR Session
- Как получить доступ к компоненту записи через доступ к AR-компонентам session
Запуск записи
Используйте 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}");
});
По умолчанию записанный файл сохраняется в persistent data path приложения, к которому можно обратиться через Application.persistentDataPath.
Путь хранения можно изменить через FrameRecorder.Configuration.FilePath. Этот путь нужно задать до начала записи, и он вступит в силу только после отключения AutoFilePath. Каталог нужно создать заранее.
Важно
Каталог хранения записанного файла должен существовать и быть доступным для записи приложением, иначе запуск записи завершится ошибкой.
Например, следующий код показывает, как сохранять файл в пользовательский каталог и генерировать имя файла по типу FrameSource, используемому в session, и текущему времени:
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 снимите Auto File Path у Frame Recorder, затем настройте остальное:

Совет
Через FrameRecorder.RecordingConfiguration.FilePath можно изменить каталог хранения и имя файла (без расширения); расширение добавляется автоматически в зависимости от формата записи.
Если файл хранится в persistent data path приложения или другом приватном каталоге, его можно экспортировать на компьютер следующими способами:
- На Android подключите устройство по USB и используйте
adb pullили другой способ; файл обычно находится в/sdcarad/Android/data/<app package name>/files. - На iOS используйте окно Devices в Xcode для экспорта файла на компьютер или доступ к приватному каталогу приложения через iTunes/Finder file sharing.
- Сохраните файл в публичный каталог с помощью кода, например в папку Downloads на Android или Photos на iOS.
Примечание
Для iOS-приложений, если вы хотите получить доступ к приватному каталогу через iTunes/Finder file sharing, перед упаковкой нужно добавить ключ UIFileSharingEnabled в Info.plist проекта Xcode и установить его в YES:

Текст, отображаемый после добавления, отличается от введённой строки; это нормально.
Изменение формата записи
Формат записи меняется через FrameRecorder.Configuration.Format, и его нужно задать до начала записи.
Например, следующий код принудительно задаёт формат H264:
frameRecorder.Configuration.Format = FrameRecorder.InternalFormat.H264;
Это можно настроить и в редакторе: выберите AR Session (EasyAR) и измените Format в окне Inspector:

Примечание
H264 нельзя использовать на некоторых устройствах (например, Windows); обычно рекомендуется Auto, который автоматически выбирает подходящий формат.
Примечание
На XREAL данные, записанные в формате Obsolete, нельзя использовать для симуляции; этот формат следует использовать только для отчёта о проблемах.
Текущий формат записи можно посмотреть через RecordingFormat.
Автоматическая запись при запуске session
Если перед запуском session установить AutoStart в true, запись начнётся вместе с session, например:
frameRecorder.AutoStart = true;
Это можно сделать и в редакторе: выберите AR Session (EasyAR) и отметьте Auto Start в Frame Recorder:

Примечание
Изменение FrameRecorder.enabled в редакторе не действует.
Данные, пригодные для Mega
При использовании Mega к EIF и связанным файлам есть особые требования. В старых версиях Unity plugin эти функции не были встроены, и данные, записанные этими версиями, нельзя использовать для Mega.
Следующие записанные данные можно использовать для Mega:
- Данные, записанные Unity Plugin версии 4000 или выше
- Данные, записанные Mega Toolbox
- Если данные записаны в формате Obsolete, например файл
x.eif, для использования также должен существовать файлx.eif.jsonв той же директории
Следующие записанные данные нельзя использовать для Mega:
- Данные, записанные Unity Plugin 4.6 или ниже
- Данные, записанные native EasyAR Sense без добавления того же содержимого, что и в Unity plugin
Кроме того, хотя Mega может работать без отслеживания движения, результат будет другим. Рекомендуется включать функцию отслеживания движения при записи файлов EIF, чтобы эффект воспроизведения подходил для большинства сценариев использования.
Следующие шаги
- Попробуйте использовать файлы EIF для имитации выполнения
- Попробуйте использовать инструмент проверки session