Android에서 녹화하는 동안 맞춤 데이터 추가

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

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

맞춤 데이터 사용 사례

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

이동 중에 AR 사용하기

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

AR 환경 공동 제작

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

기본 요건

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

맞춤 데이터로 녹음

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

맞춤 데이터로 기록 초기화

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

  1. RecordingConfig를 가져옵니다.
  2. 맞춤 UUID로 새 Track를 만듭니다. 모든 맞춤 데이터가 여기에 저장됩니다.
  3. 세션 구성 중에 만든 RecordingConfigTrack을 추가합니다.

자바

// 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.
UUID trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893"); // from UUID generator
Track track = new Track(session).setId(trackUUID);

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track);

Kotlin

// 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.
val trackUUID = UUID.fromString("de5ec7a4-09ec-4c48-b2c3-a98b66e71893") // from UUID generator
val track = Track(session).setId(trackUUID)

// Add the Track to the recordingConfig.
// recordingConfig must already be configured.
recordingConfig.addTrack(track)

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

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

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

자바

// Set additional data on this track.
// For example, describe where you recorded the session.
byte[] customTrackData = "airport".getBytes(StandardCharsets.UTF_8);
track.setMetadata(ByteBuffer.wrap(customTrackData));

Kotlin

// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = "airport".toByteArray()
track.setMetadata(ByteBuffer.wrap(customTrackData))

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

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

자바

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

Kotlin

// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv")

맞춤 데이터 트랙 녹음

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

맞춤 데이터 트랙을 기록하려면 데이터를 ByteBuffer로 변환하고 recordTrackData()를 호출합니다.

자바

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  Lamp lampProduct = Lamp.FLOOR; // a floor lamp
  // Convert the lamp data into a byte array.
  ByteBuffer lampData = ByteBuffer.wrap(new byte[] {(byte) lampProduct.ordinal()});
  frame.recordTrackData(trackUUID, lampData);
}

Kotlin

// Place an AR lamp in a room.
if (placeLampButtonWasPressed) {
  val lampProduct = Lamp.FLOOR // a floor lamp
  // Convert the lamp data into a byte array.
  val lampData = ByteBuffer.wrap(byteArrayOf(lampProduct.ordinal.toByte()))
  frame.recordTrackData(trackUUID, lampData)
}

맞춤 데이터 트랙 재생

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

재생 초기화

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

커스텀 데이터 반환

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

자바

// Fetch the data recorded on a select frame and place it in a container object.
Collection<TrackData> trackDataList = frame.getUpdatedTrackData(trackUUID);

Kotlin

// Fetch the data recorded on a select frame and place it in a container object.
val trackDataList: Collection<TrackData> = frame.getUpdatedTrackData(trackUUID)

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

자바

// Extract the bytes of custom data from the list of track data.
for (TrackData trackData : trackDataList) {
  ByteBuffer bytes = trackData.getData();
  Lamp lamp = Lamp.values()[bytes.get()]; // this is the lamp!
}

Kotlin

// Extract the bytes of custom data from the list of track data.
for (trackData in trackDataList) {
  val bytes = trackData.data
  val lamp = Lamp.values()[bytes.get().toInt()] // this is the lamp!
}

다음 단계