Запись файлов EIF в Unity
В этой статье объясняется, как записывать файлы EIF в Unity для использования при симуляции.
Перед началом
- Понимание основных концепций записи файлов EIF и их использования для симуляции
- Понимание основных концепций, компонентов и рабочего процесса AR 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, что означает, что запись отключена. Даже ручная настройка в редакторе не будет иметь эффекта.
Запись начнется только во время работы сессии, когда 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 рекомендуется использовать то же устройство, что и целевое, или близкое к нему, чтобы гарантировать согласованность эффектов при воспроизведении с эффектами на целевом устройстве. Также необходимо уделить особое внимание тому, включена ли функция отслеживания движения (motion tracking) в сцене записи. Если при записи отслеживание движения было отключено, то при воспроизведении его также нельзя будет включить, и AR-функции, зависящие от него (например, карта плотного пространства, Mega и т.д.), не будут работать так же, как на устройстве.
Остановка записи
Используйте FrameRecorder.enabled = false, чтобы остановить запись, например:
frameRecorder.enabled = false;
Эта операция немедленно останавливает запись и блокирует выполнение до завершения записи файла.
Важно
Обязательно вызовите остановку записи, иначе записанный файл будет неполным, что может привести к невозможности использования части функций или всего файла:
Хранение и экспорт файлов
Можно использовать событие OnRecording для получения полного реального пути к записанному файлу:
frameRecorder.OnRecording.AddListener((file) =>
{
Debug.Log($"Recording started: {file}");
});
При настройках по умолчанию записанный файл сохраняется в постоянном пути данных приложения. Доступ к этому пути можно получить через Application.persistentDataPath.
Можно изменить путь сохранения записанного файла через FrameRecorder.Configuration.FilePath. Этот путь должен быть установлен до запуска записи, и для его применения необходимо отключить AutoFilePath. Директорию необходимо создать заранее.
Важно
Необходимо гарантировать, что директория для сохранения записанных файлов существует и приложение имеет права на запись в нее, иначе запуск записи завершится ошибкой.
Например, следующий код демонстрирует, как сохранить записанный файл в пользовательской директории, генерируя имя файла на основе типа 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 снять галочку 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
- Попробуйте инструмент проверки сессии