Table of Contents

Gravar arquivos EIF no Unity

Este artigo explica como gravar arquivos EIF no Unity para usá-los na simulação.

Antes de começar

Iniciar a gravação

Use FrameRecorder.enabled = true para iniciar a gravação, por exemplo:

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

É preciso primeiro verificar se ARAssembly.FrameRecorder existe.

Nota

ARAssembly.FrameRecorder não pode ser usado em alguns casos, por exemplo ao usar FramePlayer.

O valor padrão de FrameRecorder.enabled é false, o que significa que a gravação está desativada; mesmo que seja configurado manualmente no editor, isso não terá efeito.

A gravação só começará quando, durante a execução da session, FrameRecorder.Status >= FrameRecorder.RecorderStatus.Ready.

Se FrameRecorder.Status < FrameRecorder.RecorderStatus.Ready, você pode usar o evento OnReady para aguardar a gravação ficar pronta.

Session.GetComponent<FrameRecorder>().OnReady.AddListener(() => {
    // A gravação pode começar
});

Você pode usar o evento OnRecording para confirmar que a inicialização foi bem-sucedida:

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

Se a inicialização falhar, nenhum evento será disparado, mas você pode verificar se FrameRecorder.Status é Error para confirmar.

Importante

O resultado da execução ao reproduzir EIF na cena depende do dispositivo usado na gravação e da frame source escolhida naquele momento. Por isso, ao gravar EIF, recomenda-se usar um dispositivo igual ou próximo do dispositivo alvo, para garantir que o efeito da reprodução seja consistente com o do dispositivo alvo. Também é importante observar se a função de rastreamento de movimento estava ativada na cena gravada. Se ela não estava ativada durante a gravação, também não poderá ser ativada durante a reprodução, e as funções AR que dependem de rastreamento de movimento (por exemplo, mapeamento espacial denso, Mega, etc.) também não funcionarão como no dispositivo.

Parar a gravação

Use FrameRecorder.enabled = false para parar a gravação, por exemplo:

frameRecorder.enabled = false;

Essa operação para a gravação imediatamente e bloqueia até que a escrita do arquivo seja concluída.

Importante

Você deve chamar a parada da gravação; caso contrário, o arquivo gravado ficará incompleto e algumas funções ou até o arquivo inteiro não poderão ser usados:

  • Se o formato de gravação for H264, o arquivo EIF não poderá saltar para um ponto de tempo específico durante a reprodução (seek), apenas poderá ser reproduzido do início
  • Se o formato de gravação for Obsolete, o arquivo EIF não poderá ser usado

Armazenamento e exportação de arquivos

Você pode usar o evento OnRecording para obter o caminho real completo do arquivo gravado:

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

Com a configuração padrão, o arquivo gravado é salvo no persistent data path do aplicativo, acessível por meio de Application.persistentDataPath.

Você pode alterar o caminho de armazenamento com FrameRecorder.Configuration.FilePath. Esse caminho deve ser definido antes do início da gravação e só terá efeito depois que AutoFilePath for desativado. O diretório precisa ser criado com antecedência.

Importante

O diretório de armazenamento do arquivo gravado deve existir e ser gravável pelo aplicativo, caso contrário a gravação falhará ao iniciar.

Por exemplo, o código a seguir mostra como armazenar o arquivo gravado em um diretório personalizado e gerar o nome do arquivo com base no tipo de FrameSource usado pela session e no horário atual:

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;

Você também pode configurar isso no editor: selecione AR Session (EasyAR) e, na janela Inspector, desmarque Auto File Path em Frame Recorder e configure o restante:

alt text

Dica

Você pode alterar o diretório de armazenamento e o nome do arquivo (sem extensão) por meio de FrameRecorder.RecordingConfiguration.FilePath; a extensão do arquivo é adicionada automaticamente de acordo com o formato de gravação.

  • Se o formato de gravação for H264, a extensão é .mkveif
  • Se o formato de gravação for Obsolete, a extensão é .eif

Se o arquivo for salvo no persistent data path do aplicativo ou em outro caminho privado, você pode exportá-lo para o computador das seguintes formas:

  • No Android, conecte o dispositivo ao computador via USB e use adb pull ou outro método para exportar o arquivo; normalmente ele fica em /sdcarad/Android/data/<app package name>/files.
  • No iOS, use a janela Devices do Xcode para exportar o arquivo para o computador, ou acesse o diretório privado do aplicativo via compartilhamento de arquivos do iTunes ou Finder.
  • Salve o arquivo em um diretório público por código, por exemplo a pasta Downloads no Android ou Fotos no iOS.
Nota

Para apps iOS, se você quiser acessar o diretório privado do aplicativo via compartilhamento de arquivos do iTunes ou Finder, antes do empacotamento é necessário adicionar a chave UIFileSharingEnabled ao Info.plist do projeto Xcode e defini-la como YES:

alt text

O texto exibido depois da adição é diferente da string digitada; isso é normal.

Alterar o formato de gravação

Altere o formato de gravação por meio de FrameRecorder.Configuration.Format, e isso deve ser configurado antes de iniciar a gravação.

Por exemplo, o código abaixo força o formato de gravação para H264:

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

Você também pode configurá-lo no editor: selecione AR Session (EasyAR) e altere Format na janela Inspector:

alt text

Nota

H264 não pode ser usado em alguns dispositivos (por exemplo Windows); normalmente é recomendado usar Auto, que escolhe automaticamente o formato adequado ao dispositivo.

Nota

No XREAL, dados gravados com o formato Obsolete não podem ser usados para simular a execução; esse formato deve ser usado apenas para reportar problemas.

  • Para simulação, use dados gravados com o formato H264.
  • Para reportar problemas, use dados gravados com o formato Obsolete.

Você pode usar RecordingFormat para ver o formato de gravação atual.

Gravação automática ao iniciar a session

Se você definir AutoStart como true antes de iniciar a session, a gravação começará quando a session iniciar, por exemplo:

frameRecorder.AutoStart = true;

Você também pode fazer isso no editor: selecione AR Session (EasyAR) e marque Auto Start em Frame Recorder:

alt text

Nota

Alterar FrameRecorder.enabled no editor não tem efeito.

Dados utilizáveis para Mega

Ao usar Mega, existem alguns requisitos especiais para EIF e arquivos relacionados. Em versões antigas do plugin Unity, esses recursos não estavam integrados, e os dados gravados com essas versões não podem ser usados com Mega.

Os dados gravados podem ser usados com Mega nos seguintes casos:

  • Dados gravados com Unity Plugin versão 4000 ou superior
  • Dados gravados com Mega Toolbox
  • Se os dados foram gravados com o formato Obsolete, por exemplo o arquivo x.eif, o arquivo x.eif.json também deve existir no mesmo diretório para poder ser usado

Os dados gravados não podem ser usados com Mega nos seguintes casos:

  • Dados gravados com Unity Plugin 4.6 ou inferior
  • Dados gravados com EasyAR Sense nativo sem adicionar o mesmo conteúdo do plugin Unity

Além disso, embora o Mega possa funcionar sem rastreamento de movimento, o resultado será diferente. Recomenda-se ativar a função de rastreamento de movimento ao gravar arquivos EIF para garantir que o efeito da reprodução seja adequado à maioria dos cenários de uso.

Próximas etapas