《The Recording》和借助 Playback 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()
获取帧。您将数据记录到帧的时间与播放期间返回数据的时间相同。例如,如果您调用 recordTrackData()
并将值“A”设为 00:07:02
,则播放曲目时,您将在 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! }
后续步骤
- 了解如何利用录音和工具来开发自己的应用和选择录制和“播放”Codelab。