Запись файлов eif в unity
В этой статье объясняется, как записывать файлы eif в unity для использования в симуляции.
Перед началом
- Понимание основных концепций записи файлов eif и их использования для симуляции
- Понимание основных концепций, состава и рабочего процесса сессии ar
- Узнайте, как получить доступ к компоненту записи через доступ к компонентам 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, что означает, что запись отключена. Даже если в редакторе вручную установить значение true, это не сработает.
Запись начнется только во время работы сессии, когда 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 в сцене зависят от устройства, использовавшегося для записи, и выбранного в то время на устройстве источника кадров. Поэтому при записи файлов 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. Каталог должен быть создан заранее.
Важно
Необходимо убедиться, что каталог для хранения записанного файла существует и приложение имеет права на запись в него, иначе запуск записи завершится ошибкой.
Например, следующий код демонстрирует, как сохранить записанный файл в пользовательском каталоге, генерируя имя файла на основе типа источника кадров сессии и текущего времени:
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 можно изменить каталог хранения и имя файла (без расширения). Расширение файла добавляется автоматически в зависимости от формата записи.
Если файл хранится в постоянном пути данных приложения или другом частном пути приложения, его можно экспортировать на компьютер следующими способами:
- На Android подключите устройство к компьютеру через USB и используйте
adb pullили другой способ для экспорта файла на компьютер. Файлы обычно находятся в/sdcard/Android/data/<имя пакета приложения>/files. - На iOS можно экспортировать файл на компьютер через окно Devices в Xcode или получить доступ к частному каталогу приложения через iTunes или Finder.
- С помощью кода сохранить файл в общедоступном каталоге, например, в папке "Загрузки" на Android или в "Фото" на iOS.
Примечание
Для приложений iOS, если требуется доступ к частному каталогу приложения через iTunes или файловый обмен Finder, перед сборкой необходимо добавить ключ UIFileSharingEnabled в Info.plist проекта Xcode и установить его значение в YES:

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

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

Примечание
Изменение 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
- Попробуйте использовать инструмент проверки сессии