You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARCore单帧仅录制首个自定义轨道?多轨道录制是否支持?

关于ARCore Recording and Playback API多自定义轨道录制的问题

我在使用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]

...

问题

  1. ARCore是否支持在同一会话/单帧中录制多条自定义轨道?
  2. 是否存在未文档化限制导致仅首个注册轨道能获取数据?
  3. 若不支持多轨道,是否推荐将所有值合并到单个ByteBuffer中用单轨道录制?

环境

  • 测试设备:Pixel 7(Android 16)、Pixel 3XL(Android 12)
  • ARCore版本:1.49.0
  • 使用示例:官方Recording and Playback Sample (Java)

回答

  1. ARCore支持多自定义轨道录制,但当前版本存在实现问题
    根据ARCore官方文档描述,Recording and Playback API设计上支持多条自定义轨道,但在1.49.0版本中确实存在你遇到的问题——只有首个注册的轨道能在回放时返回数据。这属于版本特定的bug,后续版本可能会修复。

  2. 是,存在未文档化的临时限制
    目前公开文档未提及该限制,但实际测试显示,该版本ARCore处理多自定义轨道时,仅会处理首个注册轨道的数据,后续轨道的录制数据无法在回放时被正确读取。这是未修复的实现问题,而非设计限制。

  3. 推荐合并数据到单轨道作为临时解决方案
    在该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:55:04