Ghi lại và phát lại một phiên thực tế tăng cường trên Android NDK

Bản ghi âm & Playback API cho phép bạn quay video và dữ liệu thực tế tăng cường (AR) một lần trong một môi trường cụ thể rồi sử dụng nội dung đó để thay thế một phiên quay video trực tiếp.

Điều kiện tiên quyết

Đảm bảo rằng bạn hiểu rõ các khái niệm cơ bản về AR và cách định cấu hình phiên ARCore trước khi tiếp tục.

Khả năng tương thích với các API ARCore khác

Do cách xử lý dữ liệu phiên, các API ARCore có thể tạo ra kết quả khác trong quá trình phát so với kết quả ghi nhận được trong quá trình ghi. Chúng cũng có thể tạo ra kết quả khác nhau trong các phiên phát tiếp theo. Ví dụ: số lượng thiết bị theo dõi được phát hiện, thời gian phát hiện chính xác và tư thế của chúng theo thời gian có thể khác nhau trong quá trình phát.

Khả năng tương thích với Cloud Anchor

Bạn có thể lưu trữ và phân giải Cloud Anchors trong khi ghi lại hoặc phát lại một phiên.

Đang ghi

Bắt đầu, dừng và kiểm tra trạng thái ghi phiên ARCore.

Ghi lại một phiên ARCore

Để ghi lại một phiên ARCore, hãy định cấu hình phiên và cung cấp URI MP4 cho bản ghi. Gọi ArSession_startRecording() trước cuộc gọi đầu tiên đến ArSession_resume(). Quá trình ghi sẽ tự động bắt đầu khi phiên tiếp tục. Để tự động dừng ghi khi phiên bị tạm dừng, hãy gọi ArRecordingConfig_setAutoStopOnPause(). Để ghi lại một phần của phiên, hãy gọi ArSession_startRecording() khi phiên đó đang chạy.

ArRecordingConfig* recording_config = nullptr;
ArRecordingConfig_create(ar_session, &recording_config);
ArRecordingConfig_setMp4DatasetUri(ar_session, recording_config,
                                   mp4_dataset_uri);
ArRecordingConfig_setAutoStopOnPause(ar_session, recording_config, true);

CHECK(ArSession_startRecording(ar_session, recording_config));
// …
// Resume ARCore session to start recording.
CHECK(ArSession_resume(ar_session));
// …
// Recording ends.
CHECK(ArSession_pause(ar_session));

Dừng bản ghi

Để dừng ghi mà không tạm dừng phiên thực tế tăng cường đang chạy, hãy gọi ArSession_stopRecording()ArRecordingConfig_destroy().

ArStatus status = ArSession_stopRecording(ar_session);
ArRecordingConfig_destroy(recording_config);

Kiểm tra trạng thái ghi

ArSession_getRecordingStatus() có thể được sử dụng bất cứ lúc nào để xác định ArRecordingStatus hiện tại.

ArRecordingStatus recording_status;
// Can be called at any time.
ArSession_getRecordingStatus(ar_session, &recording_status);
if (recording_status == AR_RECORDING_NONE) {
  // The dataset recorder is not recording.
} else if (recording_status == AR_RECORDING_OK) {
  // The dataset recorder is recording normally.
} else if (recording_status == AR_RECORDING_IO_ERROR) {
  // The dataset recorder encountered an error while recording.
}

Phát

Phát lại các phiên thực tế tăng cường đã ghi lại trước đó. Các phiên sẽ phát lại theo thời gian thực và không thể điều chỉnh tốc độ hoặc chế độ phát của phiên.

Phát lại một phiên đã ghi lại trước đây

Để phát lại một phiên đã ghi âm trước đó, hãy gọi ArSession_setPlaybackDatasetUri() trước cuộc gọi đầu tiên đến ArSession_resume().

Sau khi bắt đầu phát lại do lệnh gọi đầu tiên đến ArSession_resume(), việc tạm dừng phiên bằng cách gọi ArSession_pause() sẽ tạm ngưng việc xử lý tất cả khung hình ảnh của máy ảnh và mọi dữ liệu cảm biến khác được ghi lại trong tập dữ liệu. Khung hình ảnh của máy ảnh và dữ liệu khung cảm biến bị loại bỏ theo cách này sẽ không được xử lý lại khi phiên tiếp tục lại bằng cách gọi ArSession_resume(). Hoạt động theo dõi thực tế tăng cường cho phiên thường sẽ bị ảnh hưởng do thiếu dữ liệu được xử lý.

// Specify previously recorded MP4 file.
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// …
// Playback starts from the beginning of the dataset.
CHECK(ArSession_resume(ar_session));
// …
// Pause AR session, but allow playback to silently continue.
CHECK(ArSession_pause(ar_session));
// …
// Resume AR session. Playback continues with gap to paused session.
CHECK(ArSession_resume(ar_session));

Phát lại từ đầu

Để bắt đầu phát lại từ đầu tập dữ liệu, hãy tạm dừng phiên và cuộc gọi ArSession_setPlaybackDatasetUri()! chỉ định cùng một bản ghi MP4 trước khi tiếp tục phiên.

CHECK(ArSession_pause(ar_session));
// Pause and specify the *same* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, mp4_dataset_uri));
// Playback starts from the *beginning* of the dataset.
CHECK(ArSession_resume(ar_session));

Phát lại một phiên khác

Để phát lại một tập dữ liệu khác, hãy tạm dừng phiên và chỉ định tập dữ liệu mới trước khi tiếp tục phiên.

CHECK(ArSession_pause(ar_session));
// Pause and specify a *different* dataset:
CHECK(ArSession_setPlaybackDatasetUri(ar_session, other_mp4_dataset_uri));
// Playback starts from the *beginning* of the new dataset.
CHECK(ArSession_resume(ar_session));

Kiểm tra trạng thái phát

Sử dụng ArSession_getPlaybackStatus() bất cứ lúc nào để xác định giá trị hiện tại ArPlaybackStatus.

ArPlaybackStatus playback_status;
// Can be called at any time.
ArSession_getPlaybackStatus(ar_session, &playback_status);
if (playback_status == AR_PLAYBACK_NONE) {
  // The session is not playing back an MP4 dataset file.
} else if (playback_status == AR_PLAYBACK_OK) {
  // Playback is in process without issues.
} else if (playback_status == AR_PLAYBACK_IO_ERROR) {
  // Playback has stopped due to an error.
} else if (playback_status == AR_PLAYBACK_FINISHED) {
  // Playback has finished successfully.
}

Bước tiếp theo