Table of Contents

Gravar arquivos EIF no Unity

Este artigo descreve como gravar arquivos EIF no Unity para uso em execução simulada.

Antes de começar

Iniciar 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;
}

Note que é necessário verificar primeiro se ARAssembly.FrameRecorder existe.

Nota

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

FrameRecorder.enabled tem valor padrão false, indicando que a gravação está desativada, e mesmo se configurado manualmente no editor será ineficaz.

A gravação só começará quando a sessão estiver em execução e FrameRecorder.Status >= FrameRecorder.RecorderStatus.Ready.

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

Session.GetComponent<FrameRecorder>().OnReady.AddListener(() => {
    // Pode iniciar a gravação
});

Você pode usar o evento OnRecording para confirmar o início bem-sucedido:

frameRecorder.OnRecording.AddListener((file) =>
{
    Debug.Log($"Gravação iniciada: {file}");
});

Falhas no início não disparam eventos, mas você pode verificar se FrameRecorder.Status é Error.

Importante

O efeito de execução ao reproduzir EIF na cena está relacionado ao dispositivo usado na gravação e à fonte de quadros (frame source) selecionada naquele momento. Portanto, ao gravar arquivos EIF, recomenda-se usar o mesmo dispositivo ou um dispositivo semelhante ao dispositivo de destino para garantir que o efeito na reprodução corresponda ao efeito no dispositivo de destino. Além disso, é importante atentar se o rastreamento de movimento estava ativado durante a gravação; se não estiver ativado durante a gravação, também não poderá ser ativado durante a reprodução, e funcionalidades AR dependentes de rastreamento de movimento (como mapa espacial denso, Mega, etc.) não funcionarão de forma consistente com o dispositivo.

Parar gravação

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

frameRecorder.enabled = false;

Esta ação para imediatamente a gravação e bloqueia até que o arquivo seja gravado completamente.

Importante

É obrigatório chamar a parada da gravação, caso contrário o arquivo gravado estará incompleto, o que pode causar falhas em partes ou em toda a funcionalidade do arquivo:

  • Quando o formato de gravação é H264, o arquivo EIF não poderá saltar para um ponto de tempo específico (seek), só reproduzirá do início
  • Quando o formato de gravação é 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 completo do arquivo:

frameRecorder.OnRecording.AddListener((file) =>
{
    Debug.Log($"Gravação iniciada: {file}");
});

Na configuração padrão, o arquivo é armazenado no caminho de dados persistentes do aplicativo, acessível através de Application.persistentDataPath.

Você pode modificar o caminho de armazenamento através de FrameRecorder.Configuration.FilePath. O caminho deve ser definido antes de iniciar a gravação e AutoFilePath deve estar desativado. O diretório deve ser criado antecipadamente.

Importante

É necessário garantir que o diretório de armazenamento exista e seja gravável pelo aplicativo, caso contrário a gravação falhará ao iniciar.

Por exemplo, este código mostra como armazenar o arquivo em um diretório personalizado, gerando o nome do arquivo com base no tipo de FrameSource usado na sessão e na hora 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, no editor, selecionar AR Session (EasyAR), na janela Inspector desmarcar Auto File Path do Frame Recorder e configurar:

alt text

Dica

Através de FrameRecorder.RecordingConfiguration.FilePath você pode modificar o diretório de armazenamento e o nome do arquivo (sem extensão). A extensão será adicionada automaticamente de acordo com o formato de gravação.

  • Formato de gravação H264: extensão .mkveif
  • Formato de gravação Obsolete: extensão .eif

Se o arquivo estiver armazenado no caminho de dados persistentes do aplicativo ou em outro caminho privado, você pode exportá-lo para o computador das seguintes maneiras:

  • Android: conectar via USB e usar adb pull ou outro método para exportar, geralmente em /sdcarad/Android/data/<app package name>/files.
  • iOS: exportar via janela Devices do Xcode, ou via compartilhamento de arquivos do iTunes ou Finder para acessar o diretório privado do aplicativo.
  • Através de código, armazenar o arquivo em um diretório público, como a pasta de downloads no Android ou o álbum de fotos no iOS.
Nota

Para aplicativos iOS, se desejar acessar o diretório privado via compartilhamento de arquivos do iTunes ou Finder, adicione a chave UIFileSharingEnabled com valor YES no Info.plist do projeto XCode antes da compilação:

alt text

O texto exibido após adicionar pode diferir da string adicionada, o que é normal.

Alterar formato de gravação

Altere o formato de gravação através de FrameRecorder.Configuration.Format, obrigatoriamente antes de iniciar a gravação.

Por exemplo, este código força o formato para H264:

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

Você também pode, no editor, selecionar AR Session (EasyAR), na janela Inspector modificar Format:

alt text

Nota

H264 não está disponível em alguns dispositivos (como Windows). Geralmente recomenda-se usar Auto, que seleciona automaticamente o formato adequado ao dispositivo.

Nota

No XREAL, gravar dados no formato Obsolete não pode ser usado para execução simulada, sendo usado apenas para relatar problemas.

  • Para execução simulada, use dados gravados no formato H264.
  • Para relatar problemas, use dados gravados no formato Obsolete.

Você pode verificar o formato atual usando RecordingFormat.

Gravar automaticamente ao iniciar a sessão

Defina AutoStart como true antes de iniciar a sessão para iniciar a gravação automaticamente, por exemplo:

frameRecorder.AutoStart = true;

Você também pode, no editor, selecionar AR Session (EasyAR), na janela Inspector marcar Auto Start do Frame Recorder:

alt text

Nota

Modificar FrameRecorder.enabled no editor é ineficaz.

Dados utilizáveis pelo Mega

Ao usar o Mega, existem requisitos especiais para o conteúdo do arquivo EIF e arquivos relacionados. Versões antigas do plugin Unity não integravam essa funcionalidade, portanto dados gravados nessas versões não podem ser usados com o Mega.

Dados gravados nas seguintes situações podem ser usados com o Mega:

  • Dados gravados com Unity plugin 4000 ou superior
  • Dados gravados com Mega Toolbox
  • Se os dados foram gravados no formato Obsolete, por exemplo arquivo x.eif, é necessário que exista o arquivo x.eif.json no mesmo diretório

Dados gravados nas seguintes situações não podem ser usados com o Mega:

  • Dados gravados com Unity plugin 4.6 ou inferior
  • Dados gravados com EasyAR Sense nativo, sem adicionar conteúdo equivalente ao do plugin Unity

Além disso, embora o Mega possa funcionar sem rastreamento de movimento, o efeito é diferente. Recomenda-se ativar o rastreamento de movimento ao gravar arquivos EIF, garantindo que o efeito na reprodução atenda à maioria dos cenários de uso.

Próximos passos