在 Android 设备上录制时添加自定义数据

借助 Recording & Playback API,您可以录制现场录像,并使用该 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 使用值“A”调用 recordTrackData(),则在播放曲目时,您会在 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!
}

后续步骤