錄製與播放 API 可讓你錄製工作階段,並用於取代即時攝影機畫面。不過,這些錄製內容僅包含影片和感應器資料。您也可以將自訂資料新增至工作階段錄影功能,並在播放期間將資料傳回給您,就像是相機影像的一部分。
ARCore 不會自動在錄音內容中加入任何自訂資料。而是可讓您在錄製期間將自訂資料新增至 ARCore 影格中,並在播放期間從影格擷取相同資料。您可以自行編寫應用程式,確保使用者在播放工作階段時能取得預期的資料。
自訂資料的用途
在錄音內容中加入自訂資料,讓 AR 應用程式發揮更多可能性。以下是一些特定的用途。
隨時隨地使用 AR
過去,使用者只能在適當地點使用 AR 體驗。如果他們想將 AR 檯燈放到客廳,就必須實際站在現場,看看檯燈可能在該處的樣子。他們可以運用自訂軌道錄下客廳一次,然後隨時隨地在場景中加入虛擬家具。
共同打造 AR 體驗
如果沒有直播課程要求,使用者還能擁有更多 AR 編輯選項,方便他們隨時隨地建立和存取獨特的 AR 內容。舉例來說,他們可以錄製特定環境、加入擴增實境效果,並與好友分享。
必要條件
請務必先瞭解基本 AR 概念,以及如何設定 ARCore 工作階段,然後再繼續操作。
使用自訂資料記錄
使用自訂資料建立工作階段錄製內容。
初始化包含自訂資料的記錄
請按照下列步驟初始化使用自訂資料的記錄。如要開始、停止及查看錄製工作階段,請參閱「錄製及播放 AR 工作階段」。
- 取得
RecordingConfig
。 - 使用自訂 UUID 建立新的
Track
。所有自訂資料都會儲存在這裡。 - 將
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! }
後續步驟
- 如要瞭解如何使用錄製和播放功能建構自己的應用程式,請參閱錄製和播放程式碼研究室。