在 Android 上錄製內容時新增自訂資料

錄製與播放 API 可讓你錄製工作階段,並用於取代即時攝影機畫面。不過,這些錄製內容僅包含影片和感應器資料。您也可以將自訂資料新增至工作階段錄影功能,並在播放期間將資料傳回給您,就像是相機影像的一部分。

ARCore 不會自動在錄音內容中加入任何自訂資料。而是可讓您在錄製期間將自訂資料新增至 ARCore 影格中,並在播放期間從影格擷取相同資料。您可以自行編寫應用程式,確保使用者在播放工作階段時能取得預期的資料。

自訂資料的用途

在錄音內容中加入自訂資料,讓 AR 應用程式發揮更多可能性。以下是一些特定的用途。

隨時隨地使用 AR

過去,使用者只能在適當地點使用 AR 體驗。如果他們想將 AR 檯燈放到客廳,就必須實際站在現場,看看檯燈可能在該處的樣子。他們可以運用自訂軌道錄下客廳一次,然後隨時隨地在場景中加入虛擬家具。

共同打造 AR 體驗

如果沒有直播課程要求,使用者還能擁有更多 AR 編輯選項,方便他們隨時隨地建立和存取獨特的 AR 內容。舉例來說,他們可以錄製特定環境、加入擴增實境效果,並與好友分享。

必要條件

請務必先瞭解基本 AR 概念,以及如何設定 ARCore 工作階段,然後再繼續操作。

使用自訂資料記錄

使用自訂資料建立工作階段錄製內容。

初始化包含自訂資料的記錄

請按照下列步驟初始化使用自訂資料的記錄。如要開始、停止及查看錄製工作階段,請參閱「錄製及播放 AR 工作階段」。

  1. 取得 RecordingConfig
  2. 使用自訂 UUID 建立新的 Track。所有自訂資料都會儲存在這裡。
  3. Track 新增至您在工作階段設定期間建立的 RecordingConfig

Java

// 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。

選用:使用額外資料設定測試群組

為了方便日後辨識,您可以設定測試群組,加入用來說明工作階段記錄的其他資料。舉例來說,若要「標記」音軌,您可以新增附註來說明您錄製課程的地點和時間:「這場講座錄製在下午的購物中心內容。」

Java

// 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 類型。

Java

// 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 呼叫 recordTrackData(),並提供值「A」值,則在播放曲目時,系統會在 00:07:02 標記傳回「A」。

如要記錄自訂資料來源,請將資料轉換為 ByteBuffer,並呼叫 recordTrackData()

Java

// 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 的執行個體。

Java

// 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 進入容器物件後,請擷取自訂資料的位元組。

Java

// 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!
}

後續步驟