借助 Recording & Playback API,您可以录制现场录像,并使用该 API 代替实时摄像头画面。不过,这些记录仅包含视频和传感器数据。您还可以向时段录制添加自定义数据,并让数据在播放期间返回给您,就像这些数据是相机图像的一部分一样。
ARCore 不会自动在录制内容中包含任何自定义数据。相反,它允许您在记录期间向 ARCore 帧添加自定义数据,并在播放期间从帧中检索相同的数据。您负责对应用进行编程,以便在用户播放会话时返回预期数据。
自定义数据的使用场景
为录制内容添加自定义数据可拓展 AR 应用的可能性。以下是一些具体用例。
随时随地使用 AR
过去,用户只能在合适的地点和时间获得 AR 体验。如果他们想在客厅放置 AR 灯,则必须亲自站在客厅看看灯具的实际效果。借助自定义轨道,他们可以录制一次客厅内容,然后根据自己的喜好随时在场景中添加虚拟家具。
共同打造 AR 体验
用户无需直播会话,就有更多的 AR 编辑选项,可以随时随地创建和访问独特的 AR 内容。例如,他们可以录制给定环境、添加增强现实效果,并与朋友分享。
前提条件
确保您了解基本 AR 概念以及如何配置 ARCore 会话,然后再继续。
使用自定义数据录制
使用自定义数据创建会话录音。
使用自定义数据初始化记录
请按照以下步骤使用自定义数据初始化记录。如需开始、停止和查看录制会话,请参阅录制和播放 AR 课程。
- 获取
ArRecordingConfig
。 - 使用自定义 UUID 创建新的
ArTrack
。所有自定义数据都将保存在此处。 - 将
ArTrack
添加到您在会话配置期间创建的ArRecordingConfig
。
// 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. ArTrack* track = NULL; ArTrack_create(ar_session, &track); // String from UUID generator: de5ec7a4-09ec-4c48-b2c3-a98b66e71893 uint8_t uuid_byte_array[16] = {0xde, 0x5e, 0xc7, 0xa4, 0x09, 0xec, 0x4c, 0x48, 0xb2, 0xc3, 0xa9, 0x8b, 0x66, 0xe7, 0x18, 0x93}; ArTrack_setId(ar_session, track, uuid_byte_array); // Add the ArTrack to the recording_config. // recording_config must already be configured. ArRecordingConfig_addTrack(ar_session, recording_config, track); ArTrack_destroy(track);
所有新曲目都会被视为单独的录音,每个录制的曲目都会占用自己的 UUID。
可选:为轨道配置其他数据
为方便日后识别,您可为轨道配置描述会话记录的其他数据。例如,您可以通过添加备注来说明您录制会话的位置和时间来“标记”曲目:“本次会话是下午在购物中心录制的”。
// Set additional data on this track. // For example, describe where you recorded the session. uint8_t metadata_size = 4; uint8_t metadata[5] = "HOME"; ArTrack_setMetadata(ar_session, track, metadata, metadata_size);
可选:使用 MIME 类型配置轨道
如果您的应用需要与外部工具兼容,您可以使用 MIME 类型来配置轨道,以便描述轨道中记录的数据类型。如果您未指定类型,数据将归类为 application/text
。ARCore 在读取数据时会忽略 MIME 类型。
// Set a MIME type for compatibility with external tools. ArTrack_setMimeType(ar_session, track, "text/csv");
记录自定义数据轨道
所有自定义轨道数据都会记录到 ArFrame
中。AR 会话使用 ArSession_update()
获取帧。将数据录制到帧的时间与播放期间返回数据的时间相同。例如,如果您在 00:07:02
使用值“A”调用 ArFrame_recordTrackData()
,则在播放曲目时,您会在 00:07:02
标记处获得“A”。
如需记录自定义数据轨道,请调用 ArFrame_recordTrackData()
。
// Place an AR lamp in a room. if (place_lamp_button_was_pressed) { uint8_t lamp_data[1] = {lamp_id}; ArFrame_recordTrackData(ar_session, frame, uuid_byte_array, lamp_data, /*payload_size=*/1); }
播放自定义数据轨道
在播放期间从会话录音中提取自定义数据。
初始化播放
使用自定义数据初始化播放与初始化常规会话录制内容的播放相同。
返回自定义数据
调用 ArFrame_getUpdatedTrackData()
以检索在 ArFrame
上记录的自定义数据。也可以从同一帧中检索多个轨道数据。例如,如果您在录制期间对同一帧调用了两次 ArFrame_recordTrackData()
,则在播放期间会返回两个 ArTrackData
实例。
// Create the container to hold the track data retrieved from the frame. ArTrackDataList* fetched_track_data_list; ArTrackDataList_create(ar_session, &fetched_track_data_list); // Fetch the track data from the frame into the created container. ArFrame_getUpdatedTrackData(ar_session, frame, uuid_byte_array, fetched_track_data_list);
将 ArTrackData
放入容器对象后,提取自定义数据的字节。
// Fetch the size of the track data list. int32_t fetched_track_data_list_size; ArTrackDataList_getSize(ar_session, fetched_track_data_list, &fetched_track_data_list_size); // Iterate through the list. for (int i = 0; i < fetched_track_data_list_size; i++) { ArTrackData* fetched_track_data; ArTrackDataList_acquireItem(ar_session, fetched_track_data_list, i, &fetched_track_data); // Process "fetched_track_data->sample" as desired ArTrackData_release(fetched_track_data); } ArTrackDataList_destroy(fetched_track_data_list);
后续步骤
- 学习“录制和播放”Codelab,了解如何使用“录制和播放”功能构建您自己的应用。