Запишите и воспроизведите сеанс AR на AR Foundation для Android.

API записи и воспроизведения позволяет вам записывать видео и данные AR один раз в определенной среде и использовать этот контент для замены сеанса прямой трансляции с камеры.

Предварительные условия

Прежде чем продолжить, убедитесь, что вы понимаете фундаментальные концепции AR и то, как настроить сеанс ARCore .

Совместимость с другими API ARCore.

Из-за способа обработки данных сеанса API ARCore могут давать во время воспроизведения результаты, отличные от тех, которые наблюдаются во время записи. Они также могут давать разные результаты во время последующих сеансов воспроизведения. Например, количество обнаруженных объектов отслеживания, точное время их обнаружения и их положение во времени могут различаться во время воспроизведения.

Совместимость с облачными якорями

Вы можете размещать и разрешать облачные привязки во время записи или воспроизведения сеанса.

Запись

Запускайте, останавливайте и проверяйте состояние записи сеанса ARCore.

Запись сеанса ARCore

Чтобы записать сеанс ARCore, настройте сеанс и укажите URI MP4 для записи. Вызовите ARRecordingManager.StartRecording() перед возобновлением сеанса. Запись начинается автоматически при возобновлении сеанса. Чтобы автоматически остановить запись при приостановке сеанса, вызовите ARRecordingConfig.AutoStopOnPause . Чтобы записать частичный сеанс, вызовите ARRecordingManager.StartRecording() во время работы сеанса.

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

recordingManager.StartRecording(recordingConfig);

Остановить запись сеанса

Чтобы остановить запись, не приостанавливая текущий сеанс AR, вызовите ARRecordingManager.StopRecording() .

recordingManager.StopRecording();

Проверить статус записи

ARRecordingManager.RecordingStatus можно использовать в любое время для определения текущего состояния записи.

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

Воспроизведение

Воспроизведение ранее записанных сеансов AR. Сеансы воспроизводятся в реальном времени, при этом воспроизведение или скорость сеанса нельзя регулировать.

Воспроизведение ранее записанного сеанса

Чтобы воспроизвести ранее записанный сеанс, вызовите ARPlaybackManager.SetPlaybackDatasetUri() и укажите URI для набора данных, который вы хотите воспроизвести. Чтобы использовать этот метод, необходимо приостановить сеанс. Возобновите сеанс, чтобы изменения вступили в силу.

После начала воспроизведения из-за возобновления сеанса приостановка сеанса путем отключения ARSession приостановит обработку всех кадров изображения камеры и любых других записанных данных датчиков в наборе данных. Кадры изображения камеры и данные кадров датчика, отброшенные таким образом, не будут повторно обработаны при возобновлении сеанса путем возобновления сеанса. Отслеживание сеанса в дополненной реальности обычно страдает из-за пробелов в обработанных данных.

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

Известная проблема и способ ее решения

Существует известная проблема, из-за которой вызовы ARPlaybackManager.SetPlaybackDatasetUri() возвращают ErrorPlaybackFailed . Это происходит потому, что для приостановки сеанса может потребоваться несколько кадров. Если ARPlaybackManager.SetPlaybackDatasetUri() вызывается до того, как сеанс был приостановлен, он не сможет получить доступ к сеансу, поэтому вернет ошибку.

Следующий код можно использовать в качестве обходного решения.

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

    ...
}

Остановить воспроизведение

Чтобы остановить воспроизведение, вызовите ARPlaybackManager.SetPlaybackDatasetUri() и установите для URI набора данных значение 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;

Возобновить воспроизведение с начала

Чтобы возобновить воспроизведение с начала набора данных, вызовите ARPlaybackManager.SetPlaybackDatasetUri() и укажите ту же запись MP4 перед возобновлением сеанса.

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

Воспроизвести другой сеанс

Чтобы воспроизвести другой набор данных, приостановите сеанс и укажите новый набор данных перед возобновлением сеанса.

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

Проверьте статус воспроизведения

ARPlaybackManager.PlaybackStatus можно использовать в любое время для определения текущего статуса воспроизведения.

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

Что дальше