Table of Contents

Aufnahme von EIF-Dateien in Unity

Dieser Artikel erklärt, wie EIF-Dateien in Unity aufgenommen werden, um sie für Simulationsläufe zu verwenden.

Vor dem Start

Aufnahme starten

Verwende FrameRecorder.enabled = true, um die Aufnahme zu starten, z. B.:

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

Es ist wichtig zu beachten, dass hier zuerst geprüft werden muss, ob ARAssembly.FrameRecorder existiert.

Anmerkung

ARAssembly.FrameRecorder kann in seltenen Fällen, z. B. bei Verwendung von FramePlayer, nicht verwendet werden.

Der Standardwert von FrameRecorder.enabled ist false, was bedeutet, dass die Aufnahme deaktiviert ist. Selbst manuelle Konfiguration im Editor ist in diesem Fall wirkungslos.

Die Aufnahme beginnt erst, wenn während des Sitzungsbetriebs FrameRecorder.Status >= FrameRecorder.RecorderStatus.Ready ist.

Wenn FrameRecorder.Status < FrameRecorder.RecorderStatus.Ready ist, kann das Ereignis OnReady verwendet werden, um auf die Bereitschaft der Aufnahme zu warten.

Session.GetComponent<FrameRecorder>().OnReady.AddListener(() => {
    // Aufnahme kann gestartet werden
});

Das Ereignis OnRecording kann verwendet werden, um den erfolgreichen Start zu bestätigen:

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

Bei einem fehlgeschlagenen Start wird kein Ereignis ausgelöst, dies kann jedoch durch Prüfen von FrameRecorder.Status auf Error festgestellt werden.

Wichtig

Die Wiedergabequalität einer EIF-Datei in der Szene hängt vom Aufnahmegerät und der damals verwendeten frame source ab. Daher wird empfohlen, für die Aufnahme von EIF-Dateien ein Gerät zu verwenden, das dem Zielgerät entspricht oder diesem nahekommt. So wird sichergestellt, dass die Wiedergabe mit der auf dem Zielgerät übereinstimmt. Gleichzeitig muss besonders darauf geachtet werden, ob die Bewegungsverfolgungsfunktion im Aufnahmeszenario aktiviert ist. Wenn sie während der Aufnahme nicht aktiviert war, kann sie auch während der Wiedergabe nicht aktiviert werden, und AR-Funktionen, die von der Bewegungsverfolgung abhängen (z. B. dichte räumliche Karten, Mega usw.), funktionieren nicht konsistent mit dem Geräteverhalten.

Aufnahme stoppen

Verwende FrameRecorder.enabled = false, um die Aufnahme zu stoppen, z. B.:

frameRecorder.enabled = false;

Diese Aktion stoppt die Aufnahme sofort und blockiert, bis der Schreibvorgang der Datei abgeschlossen ist.

Wichtig

Das Stoppen der Aufnahme muss aufgerufen werden, da sonst die Aufnahmedatei unvollständig geschrieben wird. Dies kann dazu führen, dass Teile der Funktionen oder die gesamte Datei unbrauchbar sind:

  • Wenn das Aufnahmeformat H264 ist, kann die EIF-Datei nicht zu einem bestimmten Zeitpunkt (seek) abgespielt werden, sondern nur von Anfang an.
  • Wenn das Aufnahmeformat Obsolete ist, kann die EIF-Datei nicht verwendet werden.

Dateispeicherung und -export

Das Ereignis OnRecording kann verwendet werden, um den vollständigen Pfad der Aufnahmedatei zu erhalten:

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

Standardmäßig werden Aufnahmedateien im persistenten Datenpfad der Anwendung gespeichert. Dieser Pfad kann über Application.persistentDataPath abgerufen werden.

Der Speicherpfad der Aufnahmedatei kann über FrameRecorder.Configuration.FilePath geändert werden. Dieser Pfad muss vor dem Start der Aufnahme gesetzt werden und erfordert, dass AutoFilePath deaktiviert ist. Das Verzeichnis muss vorher erstellt werden.

Wichtig

Es muss sichergestellt werden, dass das Speicherverzeichnis für die Aufnahmedatei existiert und die Anwendung Schreibrechte darauf hat. Andernfalls schlägt der Aufnahmestart fehl.

Der folgende Code zeigt beispielsweise, wie Aufnahmedateien in einem benutzerdefinierten Verzeichnis gespeichert werden, wobei der Dateiname basierend auf dem Typ der von der Sitzung verwendeten FrameSource und der aktuellen Zeit generiert wird:

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;

Alternativ kann im Editor, nach Auswahl von AR Session (EasyAR), im Inspector-Fenster das Häkchen bei Auto File Path unter Frame Recorder entfernt und dann konfiguriert werden:

alt text

Tipp

Über FrameRecorder.RecordingConfiguration.FilePath können das Speicherverzeichnis und der Dateiname (ohne Erweiterung) geändert werden. Die Dateierweiterung wird automatisch basierend auf dem Aufnahmeformat hinzugefügt.

  • Bei Aufnahmeformat H264 ist die Erweiterung .mkveif
  • Bei Aufnahmeformat Obsolete ist die Erweiterung .eif

Wenn die Datei im persistenten Datenpfad der Anwendung oder einem anderen privaten Anwendungspfad gespeichert ist, kann sie auf folgende Weise auf einen Computer exportiert werden:

  • Auf Android-Geräten kann die Datei nach USB-Verbindung mit einem Computer über adb pull oder andere Methoden exportiert werden. Dateien befinden sich typischerweise unter /sdcarad/Android/data/<app package name>/files.
  • Auf iOS-Geräten kann die Datei über das Devices-Fenster von Xcode oder über iTunes/Finder-Dateifreigabe auf die privaten Verzeichnisse der App zugegriffen werden.
  • Über Code kann die Datei in öffentliche Verzeichnisse wie den Download-Ordner unter Android oder das Fotoalbum unter iOS gespeichert werden.
Anmerkung

Für iOS-Apps, die den Zugriff auf private Verzeichnisse über iTunes/Finder-Dateifreigabe ermöglichen sollen, muss vor dem Build im Xcode-Projekt in der Info.plist der Schlüssel UIFileSharingEnabled hinzugefügt und auf YES gesetzt werden:

alt text

Der angezeigte Text nach dem Hinzufügen kann vom hinzugefügten String abweichen – dies ist normal.

Aufnahmeformat ändern

Das Aufnahmeformat wird über FrameRecorder.Configuration.Format geändert. Dies muss vor dem Start der Aufnahme geschehen.

Der folgende Code zeigt beispielsweise, wie das Aufnahmeformat auf H264 erzwungen wird:

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

Alternativ kann im Editor, nach Auswahl von AR Session (EasyAR), im Inspector-Fenster Format geändert werden:

alt text

Anmerkung

H264 ist auf einigen Geräten (z. B. Windows) nicht verfügbar. Generell wird Auto empfohlen, da es automatisch ein geeignetes Format basierend auf dem Gerät auswählt.

Anmerkung

Auf XREAL-Geräten können mit Obsolete aufgenommene Daten nicht für Simulationsläufe verwendet werden. Sie dienen ausschließlich der Problemberichterstattung.

  • Für Simulationsläufe sollten Daten im Format H264 aufgenommen werden.
  • Für Problemberichte sollten Daten im Format Obsolete aufgenommen werden.

Der aktuelle Aufnahmeformat kann mit RecordingFormat überprüft werden.

Automatische Aufnahme beim Sitzungsstart

Durch Setzen von AutoStart auf true vor dem Start der Sitzung wird die Aufnahme beim Sitzungsstart gestartet, z. B.:

frameRecorder.AutoStart = true;

Alternativ kann im Editor, nach Auswahl von AR Session (EasyAR), im Inspector-Fenster das Häkchen bei Auto Start unter Frame Recorder gesetzt werden:

alt text

Anmerkung

Änderungen an FrameRecorder.enabled im Editor sind wirkungslos.

Für Mega verwendbare Daten

Bei der Verwendung von Mega gibt es spezielle Anforderungen an den Inhalt von EIF- und zugehörigen Dateien. In älteren Versionen des Unity-Plugins waren diese Funktionen nicht integriert. Mit diesen Versionen aufgenommene Daten können nicht für Mega verwendet werden.

Folgende Aufnahmen können für Mega verwendet werden:

  • Daten, die mit Unity Plugin 4000 oder höher aufgenommen wurden
  • Daten, die mit dem Mega Toolbox aufgenommen wurden
  • Wenn Daten im Format Obsolete aufgenommen wurden (z. B. Datei x.eif), muss in demselben Verzeichnis die Datei x.eif.json vorhanden sein

Folgende Aufnahmen können NICHT für Mega verwendet werden:

  • Daten, die mit Unity Plugin 4.6 oder niedriger aufgenommen wurden
  • Daten, die mit nativen EasyAR Sense aufgenommen wurden, ohne die gleichen zusätzlichen Daten wie im Unity Plugin hinzuzufügen

Zusätzlich: Obwohl Mega ohne Bewegungsverfolgung arbeiten kann, ist die Laufleistung unterschiedlich. Es wird empfohlen, die Bewegungsverfolgungsfunktion bei der Aufnahme von EIF-Dateien zu aktivieren, um sicherzustellen, dass die Wiedergabe den meisten Anwendungsfällen entspricht.

Nächste Schritte