Android NDK'da AR oturumu kaydetme ve oynatma

Kayıt ve Playback API'si, video ve AR verilerini belirli bir ortamda bir kez kaydedip bu içeriği canlı kamera oturumu yerine kullanmanızı sağlar.

Ön koşullar

Temel artırılmış gerçeklik kavramlarını anladığınızdan emin olun ve devam etmeden önce ARCore oturumunun nasıl yapılandırılacağı hakkında daha fazla bilgi edinin.

Diğer ARCore API'leriyle uyumluluk

Oturum verilerinin işlenme biçimi nedeniyle, ARCore API'leri oynatma sırasında kayıt sırasında gözlemlenenden farklı sonuçlar üretebilir. Ayrıca sonraki oynatma oturumlarında farklı sonuçlar üretebilirler. Örneğin, tespit edilen izlenebilir içeriklerin sayısı, tespit edilmelerinin tam zamanlaması ve zaman içindeki duruşları, oynatma sırasında farklı olabilir.

Cloud Anchor ile uyumluluk

Bir oturumu kaydederken veya oynatırken Cloud Anchor'larını barındırabilir ve çözümleyebilirsiniz.

Kayıt

ARCore oturum kaydını başlatın, durdurun ve durumunu kontrol edin.

ARCore oturumunu kaydetme

ARCore oturumunu kaydetmek için oturumu yapılandırın ve kayıt için bir MP4 URI'si sağlayın. ArSession_resume() numaralı telefona yapılan ilk aramadan önce ArSession_startRecording() adlı kişiyi arayın. Oturum devam ettiğinde kayıt otomatik olarak başlar. Oturum duraklatıldığında kaydı otomatik olarak durdurmak için ArRecordingConfig_setAutoStopOnPause() numaralı telefonu arayın. Kısmi bir oturumu kaydetmek için oturum devam ederken ArSession_startRecording() numarasını arayın.

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

Kaydı durdurma

Şu anda devam eden AR oturumunu duraklatmadan kaydı durdurmak için şu numarayı arayın: ArSession_stopRecording() ve ArRecordingConfig_destroy().

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

Kayıt durumunu kontrol edin

ArSession_getRecordingStatus() mevcut ArRecordingStatus değerini belirlemek için kullanılabilir.

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

Oynatma

Önceden kaydedilen AR oturumlarını oynatma. Oturumlar gerçek zamanlı olarak oynatılır ve oturum oynatma veya hızı ayarlanamaz.

Daha önce kaydedilmiş bir oturumu oynatma

Daha önce kaydedilmiş bir oturumu oynatmak için şu numarayı arayın: ArSession_setPlaybackDatasetUri() yapılacak ilk çağrıdan önce ArSession_resume().

ArSession_resume() için yapılan ilk çağrı nedeniyle oynatma başladıktan sonra ArSession_pause() numaralı telefonu arayarak oturumu duraklatmak, tüm kamera görüntü çerçevelerinin ve veri kümesinde kayıtlı diğer tüm sensör verilerinin işlenmesini askıya alır. Bu şekilde silinen kamera görüntü çerçeveleri ve sensör çerçevesi verileri, ArSession_resume() çağrısı yapılarak oturum yeniden başlatıldığında yeniden işlenmez. Oturumun AR izlemesi genellikle işlenen verilerdeki boşluk nedeniyle yaşanır.

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

Oynatmayı baştan yeniden başlat

Bir oynatmayı veri kümesinin başından yeniden başlatmak için oturumu duraklatın ve telefon etmek ArSession_setPlaybackDatasetUri() ve oturumu devam ettirmeden önce aynı MP4 kaydını belirtin.

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

Farklı bir oturumu oynat

Farklı bir veri kümesini oynatmak için oturumu duraklatın ve yeni veri kümesini belirtin .

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

Oynatma durumunu kontrol etme

Tekliflerinizi otomatikleştirmek ve optimize etmek için ArSession_getPlaybackStatus() kullanarak mevcut 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.
}

Sırada ne var?