ARCore单帧仅录制首个自定义轨道?多轨道录制是否支持?
我在使用ARCore的Recording and Playback API时,尝试在单个会话和单帧中把自定义数据录制到多条自定义轨道。API允许注册并写入多条轨道,但回放时只有首个注册的轨道能获取到数据,第二条轨道调用frame.getUpdatedTrackData(...)始终返回空列表,即便录制时已经写入了不同的数据。
操作步骤
基于官方ARCore「Recording and Playback」Java版示例应用做了如下修改:
- 录制开始前注册两条自定义轨道
- 每帧通过
recordTrackData(...)向每条轨道写入一个常量整数值
相关简化代码如下:
Track trackA = new Track(session).setId(TRACK_A_ID); Track trackB = new Track(session).setId(TRACK_B_ID); RecordingConfig recordingConfig = new RecordingConfig(session) ... .addTrack(trackA) .addTrack(trackB); session.startRecording(recordingConfig)
每帧执行的代码:
private void recordCustomData(Frame frame) { int value1 = 1; int value2 = 2; ByteBuffer byteBuffer1 = ByteBuffer.allocate(4); byteBuffer1.putInt(value1); ByteBuffer byteBuffer2 = ByteBuffer.allocate(4); byteBuffer2.putInt(value2); frame.recordTrackData(TRACK_A_ID, byteBuffer1); frame.recordTrackData(TRACK_B_ID, byteBuffer2); } private void getCustomData(Frame frame) { Log.d(TAG, "TRACK_A_ID track: " + frame.getUpdatedTrackData(TRACK_A_ID)); Log.d(TAG, "TRACK_B_ID track: " + frame.getUpdatedTrackData(TRACK_B_ID)); }
结果
仅一条轨道能获取数据,日志示例:
... TRACK_A_ID track: [com.google.ar.core.TrackData] TRACK_B_ID track: [] TRACK_A_ID track: [com.google.ar.core.TrackData] TRACK_B_ID track: [] ...
若调换轨道注册顺序及写入顺序,则另一条轨道能获取数据:
RecordingConfig recordingConfig = new RecordingConfig(session) ... .addTrack(trackB) .addTrack(trackA); private void recordCustomData(Frame frame) { ... frame.recordTrackData(TRACK_B_ID, byteBuffer2); frame.recordTrackData(TRACK_A_ID, byteBuffer1); }
日志输出变为:
... TRACK_A_ID track: [] TRACK_B_ID track: [com.google.ar.core.TrackData] TRACK_A_ID track: [] TRACK_B_ID track: [com.google.ar.core.TrackData] ...
问题
- ARCore是否支持在同一会话/单帧中录制多条自定义轨道?
- 是否存在未文档化限制导致仅首个注册轨道能获取数据?
- 若不支持多轨道,是否推荐将所有值合并到单个
ByteBuffer中用单轨道录制?
环境
- 测试设备:Pixel 7(Android 16)、Pixel 3XL(Android 12)
- ARCore版本:1.49.0
- 使用示例:官方Recording and Playback Sample (Java)
回答
ARCore支持多自定义轨道录制,但当前版本存在实现问题
根据ARCore官方文档描述,Recording and Playback API设计上支持多条自定义轨道,但在1.49.0版本中确实存在你遇到的问题——只有首个注册的轨道能在回放时返回数据。这属于版本特定的bug,后续版本可能会修复。是,存在未文档化的临时限制
目前公开文档未提及该限制,但实际测试显示,该版本ARCore处理多自定义轨道时,仅会处理首个注册轨道的数据,后续轨道的录制数据无法在回放时被正确读取。这是未修复的实现问题,而非设计限制。推荐合并数据到单轨道作为临时解决方案
在该bug修复前,将所有自定义数据合并到单个ByteBuffer中通过单轨道录制是最可靠的方案。你可以在数据中加入标识字段(比如轨道ID、数据长度等),回放时再解析拆分出不同内容。示例代码如下:
// 录制时合并数据 ByteBuffer combinedBuffer = ByteBuffer.allocate(8); combinedBuffer.putInt(TRACK_A_ID); // 加入轨道标识 combinedBuffer.putInt(value1); combinedBuffer.putInt(TRACK_B_ID); combinedBuffer.putInt(value2); frame.recordTrackData(COMBINED_TRACK_ID, combinedBuffer); // 回放时解析 List<TrackData> trackDataList = frame.getUpdatedTrackData(COMBINED_TRACK_ID); for (TrackData data : trackDataList) { ByteBuffer buffer = data.getData(); while (buffer.hasRemaining()) { int trackId = buffer.getInt(); int value = buffer.getInt(); if (trackId == TRACK_A_ID) { // 处理trackA的数据 } else if (trackId == TRACK_B_ID) { // 处理trackB的数据 } } }
另外,你也可以尝试升级ARCore到最新版本,检查该问题是否已被修复。
内容的提问来源于stack exchange,提问作者Roman

