Android NDK에서 기록하는 동안 맞춤 데이터 추가

녹화 및 Playback API를 사용하면 세션을 녹화하고 실시간 카메라 피드 대신 사용할 수 있습니다. 하지만 이러한 녹화 파일에는 동영상 및 센서 데이터만 포함됩니다. 또한 세션 녹화에 맞춤 데이터를 추가하고 카메라 이미지의 일부인 것처럼 재생 중에 이 데이터가 반환되도록 할 수 있습니다.

ARCore는 기록에 맞춤 데이터를 자동으로 포함하지 않습니다. 그보다는 녹화 중에 ARCore 프레임에 맞춤 데이터를 추가하고 재생하는 동안 프레임에서 동일한 데이터를 가져올 수 있습니다. 사용자가 세션을 재생할 때 예상되는 데이터를 다시 얻을 수 있도록 앱을 프로그래밍하는 것은 개발자의 몫입니다.

커스텀 데이터의 사용 사례

녹음 파일에 맞춤 데이터를 추가하면 AR 앱의 가능성이 확장됩니다. 다음은 구체적인 사용 사례입니다.

이동 중에 AR 사용하기

과거에는 사용자가 적절한 장소와 시간에만 AR 환경에 액세스할 수 있었습니다. 거실에 AR 램프를 설치하려면 해당 위치에 실제로 서서 램프가 어떻게 보이는지 확인해야 했습니다. 맞춤 트랙을 사용하면 거실을 한 번 녹화하고 원할 때마다 가상 가구를 장면에 추가할 수 있습니다.

AR 환경 공동 제작하기

라이브 세션 요구사항이 없어도 사용자는 더 많은 AR 편집 옵션을 사용할 수 있으므로 언제 어디서나 고유한 AR 콘텐츠를 만들고 액세스할 수 있습니다. 예를 들어 특정 환경을 녹화하고 증강 현실 효과를 추가한 다음 친구와 공유할 수 있습니다.

기본 요건

기본 AR 개념을 이해합니다. ARCore 세션을 구성하는 방법을 알아보세요.

커스텀 데이터로 기록

커스텀 데이터로 세션 녹화를 만듭니다.

맞춤 데이터로 기록 초기화

맞춤 데이터로 기록을 초기화하려면 다음 단계를 따르세요. 녹화 세션을 시작, 중지, 확인하려면 AR 세션 녹화 및 재생을 참고하세요.

  1. ArRecordingConfig를 가져옵니다.
  2. 맞춤 UUID로 새 ArTrack를 만듭니다. 모든 맞춤 데이터가 여기에 저장됩니다.
  3. 세션 구성 중에 만든 ArRecordingConfigArTrack를 추가합니다.
// Initialize a new track with a custom UUID.
// Make sure to save the UUID because it is the ID that you will use to get
// your data back during playback.
ArTrack* track = NULL;
ArTrack_create(ar_session, &track);
// String from UUID generator: de5ec7a4-09ec-4c48-b2c3-a98b66e71893
uint8_t uuid_byte_array[16] = {0xde, 0x5e, 0xc7, 0xa4, 0x09, 0xec,
                               0x4c, 0x48, 0xb2, 0xc3, 0xa9, 0x8b,
                               0x66, 0xe7, 0x18, 0x93};
ArTrack_setId(ar_session, track, uuid_byte_array);

// Add the ArTrack to the recording_config.
// recording_config must already be configured.
ArRecordingConfig_addTrack(ar_session, recording_config, track);
ArTrack_destroy(track);

모든 새 트랙은 별도의 녹음 파일로 취급되며 녹음된 각 트랙은 자체 UUID를 사용합니다.

선택사항: 추가 데이터로 트랙 구성

나중에 이 트랙을 식별하려면 세션 녹음에 대해 설명하는 추가 데이터로 트랙을 구성하면 됩니다. 예를 들어 세션을 녹화한 위치와 시간을 설명하는 메모를 추가하여 트랙에 '태그'를 추가할 수 있습니다. '이 세션은 오후에 쇼핑몰에서 녹화되었습니다.'

// Set additional data on this track.
// For example, describe where you recorded the session.
uint8_t metadata_size = 4;
uint8_t metadata[5] = "HOME";
ArTrack_setMetadata(ar_session, track, metadata, metadata_size);

선택사항: MIME 유형으로 트랙 구성

앱이 외부 도구와 호환되어야 하는 경우 트랙에 기록된 데이터 유형을 설명하는 MIME 유형으로 트랙을 구성할 수 있습니다. 유형을 지정하지 않으면 데이터가 application/text로 분류됩니다. ARCore는 데이터를 읽을 때 MIME 유형을 무시합니다.

// Set a MIME type for compatibility with external tools.
ArTrack_setMimeType(ar_session, track, "text/csv");

맞춤 데이터 트랙 기록

모든 맞춤 트랙 데이터는 ArFrame에 기록됩니다. AR 세션은 ArSession_update()를 사용하여 프레임을 가져옵니다. 프레임에 데이터를 기록하는 시간은 재생 중에 데이터가 반환되는 시간과 동일합니다. 예를 들어 00:07:02에서 'A' 값을 사용하여 ArFrame_recordTrackData()를 호출하면 트랙이 재생될 때 00:07:02 표시에서 'A'가 반환됩니다.

맞춤 데이터 트랙을 기록하려면 ArFrame_recordTrackData()를 호출합니다.

// Place an AR lamp in a room.
if (place_lamp_button_was_pressed) {
  uint8_t lamp_data[1] = {lamp_id};
  ArFrame_recordTrackData(ar_session, frame, uuid_byte_array, lamp_data,
                          /*payload_size=*/1);
}

맞춤 데이터 트랙 재생

재생 중에 세션 녹음에서 맞춤 데이터를 추출합니다.

재생 초기화

맞춤 데이터로 재생을 초기화하는 것은 일반 세션 녹화의 재생을 초기화하는 것과 같습니다.

커스텀 데이터 반환

ArFrame_getUpdatedTrackData()를 호출하여 ArFrame에 기록된 맞춤 데이터를 가져옵니다. 동일한 프레임에서 여러 트랙 데이터를 검색할 수 있습니다. 예를 들어 녹화 중에 동일한 프레임에서 ArFrame_recordTrackData()를 두 번 호출했다면 재생 중에 ArTrackData의 인스턴스 두 개가 반환됩니다.

// Create the container to hold the track data retrieved from the frame.
ArTrackDataList* fetched_track_data_list;
ArTrackDataList_create(ar_session, &fetched_track_data_list);

// Fetch the track data from the frame into the created container.
ArFrame_getUpdatedTrackData(ar_session, frame, uuid_byte_array,
                            fetched_track_data_list);

ArTrackData가 컨테이너 객체에 있으면 커스텀 데이터의 바이트를 추출합니다.

// Fetch the size of the track data list.
int32_t fetched_track_data_list_size;
ArTrackDataList_getSize(ar_session, fetched_track_data_list,
                        &fetched_track_data_list_size);

// Iterate through the list.
for (int i = 0; i < fetched_track_data_list_size; i++) {
  ArTrackData* fetched_track_data;
  ArTrackDataList_acquireItem(ar_session, fetched_track_data_list, i,
                              &fetched_track_data);
  // Process "fetched_track_data->sample" as desired
  ArTrackData_release(fetched_track_data);
}
ArTrackDataList_destroy(fetched_track_data_list);

다음 단계