Table of Contents

Grabar archivos eif en unity

Este artículo describe cómo grabar archivos eif en unity para su uso en simulaciones.

Antes de comenzar

Iniciar la grabación

Usa FrameRecorder.enabled = true para iniciar la grabación, por ejemplo:

if (Session.State >= ARSession.SessionState.Ready && Session.Assembly.FrameRecorder.OnSome)
{
    var frameRecorder = Session.Assembly.FrameRecorder.Value;
    frameRecorder.enabled = true;
}

Es importante notar que primero se debe verificar si existe ARAssembly.FrameRecorder.

Nota

ARAssembly.FrameRecorder no está disponible en algunos casos, como cuando se usa FramePlayer.

FrameRecorder.enabled tiene un valor predeterminado de false, lo que significa que la grabación está desactivada, incluso si se configura manualmente en el editor.

La grabación comenzará durante la ejecución de la sesión, cuando FrameRecorder.Status >= FrameRecorder.RecorderStatus.Ready.

Si FrameRecorder.Status < FrameRecorder.RecorderStatus.Ready, se puede usar el evento OnReady para esperar a que la grabación esté lista.

Session.GetComponent<FrameRecorder>().OnReady.AddListener(() => {
    // Se puede iniciar la grabación
});

Se puede usar el evento OnRecording para confirmar que se inició correctamente:

frameRecorder.OnRecording.AddListener((file) =>
{
    Debug.Log($"Recording started: {file}");
});

No hay evento para fallos al iniciar, pero se puede verificar si FrameRecorder.Status es Error.

Importante

El efecto de reproducción en escena de un eif depende del dispositivo usado para grabarlo y del frame source seleccionado en ese momento. Por lo tanto, al grabar archivos eif, se recomienda usar dispositivos idénticos o similares al dispositivo objetivo, para garantizar efectos consistentes. También es crucial verificar si el seguimiento de movimiento estaba habilitado durante la grabación, ya que si no estaba habilitado, durante la reproducción tampoco podrá habilitarse, y las funciones ar que dependen del seguimiento de movimiento (como mapas espaciales densos o mega) no funcionarán igual que en el dispositivo.

Detener la grabación

Usa FrameRecorder.enabled = false para detener la grabación, por ejemplo:

frameRecorder.enabled = false;

Esta acción detendrá la grabación inmediatamente y se bloqueará hasta que se complete la escritura del archivo.

Importante

Se debe llamar a detener la grabación, de lo contrario el archivo estará incompleto y podría ser inutilizable:

  • Cuando el formato de grabación es H264, el archivo eif no podrá saltar a puntos específicos (seek), solo reproducirá desde el inicio
  • Cuando el formato de grabación es Obsolete, el archivo eif será inutilizable

Almacenamiento y exportación de archivos

Puedes usar el evento OnRecording para obtener la ruta completa del archivo grabado:

frameRecorder.OnRecording.AddListener((file) =>
{
    Debug.Log($"Recording started: {file}");
});

De forma predeterminada, los archivos grabados se almacenan en la ruta de datos persistentes de la aplicación, accesible a través de Application.persistentDataPath.

Puedes modificar la ruta de almacenamiento mediante FrameRecorder.Configuration.FilePath. Esta ruta debe configurarse antes de iniciar la grabación, y solo surtirá efecto después de desactivar AutoFilePath. Es necesario crear el directorio previamente.

Importante

Se debe garantizar que el directorio de almacenamiento exista y que la aplicación tenga permisos de escritura, de lo contrario la grabación fallará al iniciar.

Por ejemplo, este código muestra cómo almacenar el archivo en un directorio personalizado, generando un nombre de archivo basado en el tipo de FrameSource de la sesión y la hora actual:

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;

También puedes, en el editor, seleccionar AR Session (EasyAR), y en la ventana Inspector desmarcar Auto File Path de Frame Recorder para configurarlo:

alt text

Consejo

A través de FrameRecorder.RecordingConfiguration.FilePath puedes modificar el directorio de almacenamiento y el nombre del archivo (sin extensión). La extensión se agregará automáticamente según el formato de grabación.

  • Cuando el formato es H264, la extensión es .mkveif
  • Cuando el formato es Obsolete, la extensión es .eif

Si el archivo se almacena en la ruta de datos persistentes u otra ruta privada, puedes exportarlo a una computadora mediante:

  • Android: Conectar el dispositivo por USB y usar adb pull u otro método para exportar el archivo, generalmente ubicado en /sdcarad/Android/data/<app package name>/files.
  • iOS: Exportar a través de la ventana Devices de Xcode, o mediante intercambio de archivos de iTunes o Finder.
  • Mediante código, almacenar el archivo en un directorio público, como Descargas en Android o Fotos en iOS.
Nota

Para aplicaciones iOS, si deseas acceder al directorio privado mediante iTunes o Finder, debes agregar la clave UIFileSharingEnabled con valor YES en Info.plist del proyecto de XCode antes de compilar:

alt text

El texto mostrado puede diferir de la cadena agregada, lo cual es normal.

Cambiar el formato de grabación

Modifica el formato de grabación mediante FrameRecorder.Configuration.Format. Debe configurarse antes de iniciar la grabación.

Por ejemplo, este código fuerza el formato a H264:

frameRecorder.Configuration.Format = FrameRecorder.InternalFormat.H264;

También puedes, en el editor, seleccionar AR Session (EasyAR), y en la ventana Inspector modificar Format:

alt text

Nota

H264 no está disponible en algunos dispositivos (como Windows). Generalmente se recomienda usar Auto, que seleccionará automáticamente un formato adecuado según el dispositivo.

Nota

En XREAL, los datos grabados en formato Obsolete no pueden usarse para simulaciones, solo para reportar problemas.

  • Para simulaciones, usa datos grabados en formato H264.
  • Para reportar problemas, usa datos grabados en formato Obsolete.

Puedes ver el formato actual mediante RecordingFormat.

Grabación automática al iniciar la sesión

Configura AutoStart como true antes de iniciar la sesión para iniciar la grabación automáticamente:

frameRecorder.AutoStart = true;

También puedes, en el editor, seleccionar AR Session (EasyAR), y en la ventana Inspector marcar Auto Start de Frame Recorder:

alt text

Nota

Modificar FrameRecorder.enabled en el editor no tiene efecto.

Datos compatibles con mega

Al usar mega, existen requisitos especiales para el contenido de archivos eif y relacionados. En versiones antiguas del plugin de Unity no se integraban estas funcionalidades, por lo que los datos grabados con esas versiones no son compatibles con mega.

Los datos grabados en estas situaciones son compatibles con mega:

  • Datos grabados con el plugin de Unity 4000 o superior
  • Datos grabados con Mega Toolbox
  • Si los datos se grabaron en formato Obsolete (ej. archivo x.eif), debe existir un archivo x.eif.json en el mismo directorio

Los datos grabados en estas situaciones no son compatibles con mega:

  • Datos grabados con el plugin de Unity 4.6 o inferior
  • Datos grabados con EasyAR Sense nativo, sin agregar el mismo contenido que en el plugin de Unity

Además, aunque mega puede funcionar sin seguimiento de movimiento, los efectos son diferentes. Se recomienda habilitar el seguimiento de movimiento al grabar archivos eif para garantizar efectos consistentes en la mayoría de escenarios.

Pasos siguientes