通过Recording&Playback API,您可以记录会话并使用它来代替实时摄像机供稿。但是,这些记录仅包含视频和传感器数据。您还可以将自定义数据添加到会话记录中,并在回放过程中将数据返回给您,就好像它是相机图像的一部分一样。
ARCore不会在录音中自动包括任何自定义数据。相反,它允许您在记录过程中将自定义数据添加到ARCore框架,并在回放过程中从框架中检索相同的数据。取决于您对应用程序进行编程的方式,以使用户可以在回放会话时取回期望的数据。
自定义数据的用例
在记录中添加自定义数据可扩展您的AR应用程序的可能性。以下是一些特定的用例。
随时随地使用AR
过去,用户只能在正确的位置和正确的时间访问AR体验。如果他们想在客厅里放一个AR灯,他们必须站在那里观察灯的外观。通过自定义轨道,他们可以记录自己的客厅一次,并在需要时将虚拟家具添加到场景中。
共同创造AR体验
在没有实时会话要求的情况下,用户可以使用更多选项进行AR编辑,从而允许他们在任何时间和地点创建和访问独特的AR内容。例如,他们可以记录给定的环境,添加增强现实效果并与朋友分享。
先决条件
在继续之前,请确保您了解基本的AR概念以及如何配置ARCore会话。
用自定义数据记录
创建包含自定义数据的会话记录。
使用自定义数据初始化记录
请按照以下步骤使用自定义数据初始化录制。要开始,停止和检查录制会话,请参阅“录制并播放AR会话” 。
爪哇// 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);科特林// 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 = ...
track.setTrackMetadata(ByteBuffer.wrap(customTrackData));科特林// Set additional data on this track.
// For example, describe where you recorded the session.
val customTrackData: ByteArray = ...
track.setTrackMetadata(ByteBuffer.wrap(customTrackData))
可选:使用MIME类型配置轨道
如果您的应用程序需要与外部工具兼容,则可以使用MIME类型配置轨道,该MIME类型描述轨道中记录的数据类型。如果未指定类型,则数据将分类为application/text 。读取数据时,ARCore会忽略MIME类型。
爪哇// Set a MIME type for compatibility with external tools.
track.setMimeType("text/csv");科特林// 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时会在00:07:02标记处获得“ A”。
爪哇// 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[] { lampProduct.ordinal.toByte() });
frame.recordTrackData(trackUUID, lampData);
}科特林// 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在回放过程中将获得两个TrackData实例。
爪哇// Fetch the data recorded on a select frame and place it in a
// container object.
Collection trackDataList = frame.getUpdatedTrackData(trackUUID);科特林// Fetch the data recorded on a select frame and place it in a
// container object.
val trackDataList: Collection = 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!
}科特林// 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()] // this is the lamp!
}
下一步是什么通过“记录和播放”代码实验室,了解如何使用“记录和播放”构建自己的应用程序。