Merekam dan memutar sesi AR di Android

Perekaman & Playback API memungkinkan Anda merekam video dan data AR sekali dalam lingkungan tertentu dan menggunakan konten tersebut untuk menggantikan sesi kamera live.

Prasyarat

Pastikan Anda memahami konsep AR dasar dan cara mengonfigurasi sesi ARCore sebelum melanjutkan.

Kompatibilitas dengan ARCore API lainnya

Karena cara pemrosesan data sesi, ARCore API mungkin memberikan hasil yang berbeda selama pemutaran dibandingkan dengan yang diamati selama perekaman. Keduanya juga dapat menghasilkan hasil yang berbeda selama sesi pemutaran berikutnya. Misalnya, jumlah objek yang dapat dilacak yang terdeteksi, waktu yang tepat untuk mendeteksinya, dan posenya dari waktu ke waktu mungkin berbeda selama pemutaran.

Kompatibilitas dengan Kamera Bersama

Sesi yang menggunakan Kamera Bersama dapat direkam. Namun, pemutaran untuk sesi tersebut menggunakan mode Kamera Bersama saat ini tidak tersedia.

Kompatibilitas dengan Cloud Anchor

Anda dapat menghosting dan me-resolve Cloud Anchors saat merekam atau memutar sesi.

Merekam

Memulai, menghentikan, dan memeriksa status perekaman sesi ARCore.

Merekam sesi ARCore

Untuk merekam sesi ARCore, konfigurasikan sesi dan berikan URI MP4 untuk rekaman. Panggil session.startRecording() sebelum panggilan pertama ke session.resume(). Perekaman dimulai secara otomatis saat sesi dilanjutkan. Untuk otomatis berhenti merekam saat sesi dijeda, panggil RecordingConfig.setAutoStopOnPause(). Untuk merekam sesi parsial, panggil session.startRecording() saat sesi sedang berjalan.

Java

// Configure the ARCore session.
Session session = new Session(context);
Uri destination = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
RecordingConfig recordingConfig =
        new RecordingConfig(session)
        .setMp4DatasetUri(destination)
        .setAutoStopOnPause(true);
try {
  // Prepare the session for recording, but do not start recording yet.
  session.startRecording(recordingConfig);
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to start recording", e);
}

// Resume the ARCore session to start recording.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)
val destination = Uri.fromFile(File(context.getFilesDir(), "recording.mp4"))
val recordingConfig = RecordingConfig(session)
  .setMp4DatasetUri(destination)
  .setAutoStopOnPause(true)
session.startRecording(recordingConfig)

// Resume the ARCore session to start recording.
session.resume()

Menghentikan perekaman sesi

Untuk menghentikan perekaman tanpa menjeda sesi AR yang sedang berjalan, panggil session.stopRecording().

Java

try {
  session.stopRecording();  // Stop recording.
} catch (RecordingFailedException e) {
  Log.e(TAG, "Failed to stop recording", e);
}

Kotlin

session.stopRecording()

Memeriksa status perekaman

session.getRecordingStatus() dapat digunakan kapan saja untuk menentukan RecordingStatus saat ini.

Java

// Use any time to determine current RecordingStatus.
if (session.getRecordingStatus() == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Kotlin

// Use any time to determine current RecordingStatus.
if (session.recordingStatus == RecordingStatus.OK) {
  // Update the UI to show that the session is currently being recorded.
}

Pemutaran

Memutar sesi AR yang direkam sebelumnya. Sesi diputar kembali secara real time, dan pemutaran atau kecepatan sesi tidak dapat disesuaikan.

Memutar sesi yang direkam sebelumnya

Untuk memutar ulang sesi yang direkam sebelumnya, panggil session.setPlaybackDatasetUri() sebelum panggilan pertama ke session.resume().

Setelah pemutaran dimulai karena panggilan pertama ke session.resume(), menjeda sesi dengan memanggil session.pause() akan menangguhkan pemrosesan semua frame gambar kamera dan data sensor lainnya yang direkam dalam set data. Bingkai gambar kamera dan data frame sensor yang dihapus dengan cara ini tidak akan diproses ulang saat sesi dilanjutkan kembali dengan memanggil session.resume(). Pelacakan AR untuk sesi umumnya akan terpengaruh karena kesenjangan dalam data yang diproses.

Java

// Configure the ARCore session.
Session session = new Session(context);

// Specify the previously recorded MP4 file.
Uri recordingUri = Uri.fromFile(new File(context.getFilesDir(), "recording.mp4"));
session.setPlaybackDatasetUri(recordingUri);
…

// Start playback from the beginning of the dataset.
session.resume();
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause();
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume();

Kotlin

// Configure the ARCore session.
val session = Session(context)

// Specify the previously recorded MP4 file.
val recordingUri = Uri.fromFile(File(context.filesDir, "recording.mp4"))
session.playbackDatasetUri = recordingUri
…

// Start playback from the beginning of the dataset.
session.resume()
…

// Pause the AR session, but silently continue MP4 playback. Camera frames
// and other recorded sensor data is discarded while the session is paused.
session.pause()
…

// Resume the AR session. Camera frames and other sensor data from the MP4
// that was silently played back while the session was paused is not
// processed by ARCore.
session.resume()

Mulai ulang pemutaran dari awal

Untuk memulai ulang pemutaran dari awal set data, jeda sesi dan panggil session.setPlaybackDatasetUri(), dengan menentukan rekaman MP4 yang sama sebelum melanjutkan sesi.

Java

session.pause();
// Pause and specify the SAME dataset:
session.setPlaybackDatasetUri(previousRecordingUri);
session.resume();  // Playback starts from the BEGINNING of the dataset.

Kotlin

session.pause()
// Pause and specify the SAME dataset:
session.playbackDatasetUri = previousRecordingUri
session.resume()  // Playback starts from the BEGINNING of the dataset.

Putar sesi lain

Untuk memutar {i>dataset<i} yang berbeda, jeda sesi dan tentukan {i>dataset<i} baru sebelum melanjutkan sesi.

Java

// Switch to a different dataset.
session.pause();   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.setPlaybackDatasetUri(newRecordingUri);
session.resume();  // Start playback from the beginning of the new dataset.

Kotlin

// Switch to a different dataset.
session.pause()   // Pause the playback of the first dataset.
// Specify a different dataset to use.
session.playbackDatasetUri = newRecordingUri
session.resume()  // Start playback from the beginning of the new dataset.

Memeriksa status pemutaran

Gunakan session.getPlaybackStatus() kapan saja untuk menentukan kondisi saat ini PlaybackStatus

Java

// Use any time to determine current PlaybackStatus.
if (session.getPlaybackStatus() != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Kotlin

// Use any time to determine current PlaybackStatus.
if (session.playbackStatus != PlaybackStatus.OK) {
  // Update the UI to show that the session playback has finished.
}

Langkah selanjutnya