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

Mit der Recording & Playback API können Sie Video- und AR-Daten einmal in einer bestimmten Umgebung aufzeichnen und diese Inhalte verwenden, um eine Live-Kamerasitzung zu ersetzen.

Voraussetzungen

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

Kompatibilität mit anderen ARCore APIs

Aufgrund der Verarbeitung von Sitzungsdaten können ARCore APIs bei der Wiedergabe unterschiedliche Ergebnisse liefern als bei der Aufnahme. Außerdem können sie bei nachfolgenden Wiedergabesitzungen zu unterschiedlichen Ergebnissen führen. So können sich beispielsweise die Anzahl der erkannten Tracker, der genaue Zeitpunkt ihrer Erkennung und ihre Posen im Laufe der Zeit unterscheiden.

Kompatibilität mit Cloud-Anchors

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

Aufzeichnung

Sie können eine ARCore-Sitzungsaufzeichnung starten, beenden und den Status prüfen.

ARCore-Sitzung aufzeichnen

Wenn Sie eine ARCore-Sitzung aufzeichnen möchten, konfigurieren Sie die Sitzung und geben Sie eine 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, drücken Sie ARRecordingConfig.AutoStopOnPause. Wenn Sie nur einen Teil der Sitzung aufzeichnen möchten, drücken Sie während der Sitzung die Taste ARRecordingManager.StartRecording().

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 derzeit laufende AR-Sitzung anzuhalten, drücken Sie die Taste ARRecordingManager.StopRecording().

recordingManager.StopRecording();

Aufnahmestatus prüfen

Der aktuelle Aufzeichnungsstatus kann jederzeit über ARRecordingManager.RecordingStatus ermittelt werden.

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

Wiedergabe

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

Zuvor aufgezeichnete Sitzung abspielen

Wenn Sie eine zuvor aufgezeichnete Sitzung wiedergeben möchten, rufen Sie ARPlaybackManager.SetPlaybackDatasetUri() auf und geben Sie einen URI für das Dataset an, das wiedergegeben werden soll. Sie müssen die Sitzung pausieren, um diese Methode zu verwenden. Setzen Sie die Sitzung fort, damit die Änderung wirksam wird.

Wenn die Wiedergabe nach der Fortsetzung der Sitzung gestartet wurde, wird durch das Pausieren der Sitzung durch Deaktivieren der ARSession die Verarbeitung aller Kamerabildframes und aller anderen aufgezeichneten Sensordaten im Datensatz ausgesetzt. Kamerabildframes und Sensorframe-Daten, die auf diese Weise verworfen werden, werden nicht noch einmal verarbeitet, wenn die Sitzung fortgesetzt wird. Das AR-Tracking für die Sitzung ist aufgrund der Lücke in den verarbeiteten Daten in der Regel beeinträchtigt.

// 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 Problemumgehung

Es gibt ein bekanntes Problem, bei dem Aufrufe von ARPlaybackManager.SetPlaybackDatasetUri() ErrorPlaybackFailed zurückgeben. Das liegt daran, dass es einige Frames dauern kann, bis eine Sitzung pausiert wird. Wenn ARPlaybackManager.SetPlaybackDatasetUri() aufgerufen wird, bevor die Sitzung pausiert wurde, kann nicht auf die Sitzung zugegriffen werden und es wird ein Fehler zurückgegeben.

Als Behelfslösung kann der folgende Code 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 beenden

Wenn du die Wiedergabe beenden möchtest, rufe ARPlaybackManager.SetPlaybackDatasetUri() auf und setze 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 die Wiedergabe vom Anfang des Datensatzes aus neu starten möchten, drücken Sie ARPlaybackManager.SetPlaybackDatasetUri() und geben Sie dieselbe MP4-Aufzeichnung 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;

Andere Sitzung wiedergeben

Wenn Sie ein anderes Dataset wiedergeben möchten, halten Sie die Sitzung an und geben Sie das neue Dataset an, bevor Sie die Sitzung fortsetzen.

// 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

Mit ARPlaybackManager.PlaybackStatus kannst du jederzeit den aktuellen Wiedergabestatus ermitteln.

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

Weiteres Vorgehen