Eine auf Android ausgerichtete AR-Sitzung auf der AR Foundation aufzeichnen und abspielen

Mit der Recording & Playback API kannst du in einer bestimmten Umgebung Video- und AR-Daten aufzeichnen und diese Inhalte dann als Ersatz für eine Live-Kamerasitzung verwenden.

Voraussetzungen

Machen Sie sich mit den grundlegenden AR-Konzepten und zur Konfiguration einer ARCore-Sitzung vertraut, bevor Sie fortfahren.

Kompatibilität mit anderen ARCore APIs

Aufgrund der Art und Weise, wie Sitzungsdaten verarbeitet werden, können ARCore APIs während der Wiedergabe andere Ergebnisse liefern als bei der Aufzeichnung. Auch bei nachfolgenden Wiedergabesitzungen können sie unterschiedliche Ergebnisse liefern. Beispielsweise können die Anzahl der erkannten Trackables, der genaue Zeitpunkt ihrer Erkennung und ihre Positionen im Laufe der Zeit während der Wiedergabe variieren.

Kompatibilität mit Cloud Anchors

Sie können Cloud-Anchors hosten und auflösen, während Sie eine Sitzung aufzeichnen oder abspielen.

Aufzeichnung

Sie können die Aufzeichnung einer ARCore-Sitzung starten und stoppen und ihren Status prüfen.

ARCore-Sitzung aufzeichnen

Wenn Sie eine ARCore-Sitzung aufzeichnen möchten, konfigurieren Sie die Sitzung und geben Sie einen MP4-URI für die Aufzeichnung an. Rufen Sie ARRecordingManager.StartRecording() auf, bevor Sie die Sitzung fortsetzen. Die Aufzeichnung beginnt automatisch, wenn sie fortgesetzt wird. Wenn die Aufzeichnung automatisch beendet werden soll, wenn die Sitzung pausiert wird, rufen Sie ARRecordingConfig.AutoStopOnPause an. Wenn Sie eine Teilsitzung aufzeichnen möchten, rufen Sie ARRecordingManager.StartRecording() auf, während die Sitzung läuft.

ARCoreRecordingConfig recordingConfig = ScriptableObject.CreateInstance<ARCoreRecordingConfig>();
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
recordingConfig.Mp4DatasetUri = datasetUri.AbsoluteUri;

recordingManager.StartRecording(recordingConfig);

Sitzungsaufzeichnung beenden

Wenn Sie die Aufzeichnung beenden möchten, ohne die aktuell laufende AR-Sitzung zu unterbrechen, rufen Sie ARRecordingManager.StopRecording() an.

recordingManager.StopRecording();

Aufzeichnungsstatus prüfen

ARRecordingManager.RecordingStatus kann jederzeit verwendet werden, um den aktuellen Aufzeichnungsstatus zu ermitteln.

Debug.Log("Current Recording Status: " + recordingManager.RecordingStatus);

Wiedergabe

Zuvor aufgezeichnete AR-Sitzungen abspielen. Sitzungen werden in Echtzeit wiedergegeben und die Wiedergabe oder Geschwindigkeit einer Sitzung kann nicht angepasst werden.

Zuvor aufgezeichnete Sitzung wiedergeben

Für die Wiedergabe einer zuvor aufgezeichneten Sitzung rufen Sie ARPlaybackManager.SetPlaybackDatasetUri() auf und geben einen URI für das Dataset an, das Sie wiedergeben möchten. Sie müssen die Sitzung anhalten, um diese Methode verwenden zu können. Setzen Sie die Sitzung fort, damit die Änderung wirksam wird.

Wenn du die Wiedergabe nach Fortsetzung der Sitzung gestartet hast und ARSession deaktivierst, werden alle Kamerabilder und anderen aufgezeichneten Sensordaten nicht mehr verarbeitet. Bilderrahmen- und Sensor-Frame-Daten, die auf diese Weise verworfen werden, werden nicht noch einmal verarbeitet, wenn die Sitzung durch Fortsetzen der Sitzung wieder aufgenommen wird. Das AR-Tracking für die Sitzung wird in der Regel aufgrund der Lücke in den verarbeiteten Daten leiden.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, provide a URI for the dataset you wish to play back.
Uri datasetUri = new System.Uri("file:///uri/for/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(datasetUri);

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;

Bekanntes Problem und Behelfslösung

Es gibt ein bekanntes Problem, bei dem Aufrufe von ARPlaybackManager.SetPlaybackDatasetUri() den Wert ErrorPlaybackFailed zurückgeben. Dies liegt daran, dass es mehrere Frames dauern kann, bis eine Sitzung pausiert wird. Wenn ARPlaybackManager.SetPlaybackDatasetUri() vor dem Pausieren der Sitzung aufgerufen wird, kann nicht auf die Sitzung zugegriffen werden und es wird ein Fehler zurückgegeben.

Der folgende Code kann als Behelfslösung verwendet werden.

// Workaround for known issue where `playbackManager.SetPlaybackDatasetUri()`
// returns `ErrorPlaybackFailed` because it can take several frames for a
// session to be paused.

// Reference to the ARSession component in the scene.
ARSession session;

void PlaybackDataset()
{
    setPlaybackDataset = true;

    // Pause the current AR session.
    session.enabled = false;

    // Set a timeout for retrying playback retrieval.
    timeout = 10f;
}

// Next frame
void Update()
{
    ...

    if (setPlaybackDataset)
    {
        PlaybackResult result = playbackManager.SetPlaybackDatasetUri(datasetUri);
        if (result == PlaybackResult.ErrorPlaybackFailed || result == PlaybackResult.SessionNotReady)
        {
            // Try to set the dataset again in the next frame.
            timeout -= Time.deltaTime;
        }
        else
        {
            // Do not set the timeout if the result is something other than ErrorPlaybackFailed.
            timeout = -1f;
        }

        if (timeout < 0.0f)
        {
            setPlaybackDataset = false;
            // If playback is successful, proceed as usual.
            // If playback is not successful, handle the error appropriately.
        }
    }

    ...
}

Wiedergabe stoppen

Zum Beenden einer Wiedergabe rufen Sie ARPlaybackManager.SetPlaybackDatasetUri() auf und setzen den Dataset-URI auf null.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, unset the playback dataset URI.
playbackManager.SetPlaybackDatasetUri(null);

// In the frame after that, re-enable the ARSession to resume the session using
// the device camera and other sensors.
session.enabled = true;

Wiedergabe von vorn beginnen

Wenn Sie eine Wiedergabe vom Anfang des Datasets neu starten möchten, rufen Sie ARPlaybackManager.SetPlaybackDatasetUri() auf und geben Sie dieselbe MP4-Aufnahme an, bevor Sie die Sitzung fortsetzen.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, specify the same dataset URI.
playbackManager.SetPlaybackDatasetUri(datasetUri); // Same URI that was previously set.

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the dataset.
session.enabled = true;

Eine andere Sitzung wiedergeben

Halten Sie die Sitzung an und geben Sie das neue Dataset an, bevor Sie die Sitzung fortsetzen, um ein anderes Dataset wiederzugeben.

// Disable the ARSession to pause the current AR session.
session.enabled = false;

// In the next frame, specify a new dataset URI.
Uri newDatasetUri = new System.Uri("file:///uri/for/different/dataset.mp4");
playbackManager.SetPlaybackDatasetUri(newDatasetUri); // Different URI than was previously set.

// In the frame after that, re-enable the ARSession to resume the session from
// the beginning of the new dataset.
session.enabled = true;

Wiedergabestatus prüfen

ARPlaybackManager.PlaybackStatus kann jederzeit verwendet werden, um den aktuellen Wiedergabestatus zu ermitteln.

Debug.Log("Current Playback Status: " + playbackManager.PlaybackStatus);

Nächste Schritte