本文内容
● 使用回放API
● 时间戳同步
传感器SDK提供了用于将设备数据录制到 Matroska (.mkv) 文件的 API 接口。 Matroska 容器格式可以存储视频数据、IMU数据和设备校准信息。您可以使用 k4arecorder 命令行工具进行录制,也可以直接使用录制 API 来录制内容。
有关录制 API 的详细信息,请参阅 。
有关 Matroska 文件格式规范的详细信息,请参阅 打开一个录制文件,输出录制长度,然后使用 关闭该文件。
k4a_playback_t playback_handle = NULL; if (k4a_playback_open("recording.mkv", &playback_handle) != K4A_RESULT_SUCCEEDED) { printf("Failed to open recording\n"); return 1; } uint64_t recording_length = k4a_playback_get_last_timestamp_usec(playback_handle); printf("Recording is %lld seconds long\n", recording_length / 1000000); k4a_playback_close(playback_handle);
读取 Capture
打开文件后,可以读取录制内容中的 Capture。 以下示例演示读取文件中的每个 Capture。
k4a_capture_t capture = NULL; k4a_stream_result_t result = K4A_STREAM_RESULT_SUCCEEDED; while (result == K4A_STREAM_RESULT_SUCCEEDED) { result = k4a_playback_get_next_capture(playback_handle, &capture); if (result == K4A_STREAM_RESULT_SUCCEEDED) { // Process capture here k4a_capture_release(capture); } else if (result == K4A_STREAM_RESULT_EOF) { // End of file reached break; } } if (result == K4A_STREAM_RESULT_FAILED) { printf("Failed to read entire recording\n"); return 1; }
在录制内容中查找
到达文件末尾后,耀世可能需要返回并再次读取。 若要完成此过程,可以使用 进行回读,但根据录制内容的长度,这种做法可能非常缓慢。 耀世可以改用 函数转到文件中的时间点。
在此示例中,耀世以微秒为单位指定了时间戳,以定位到文件中的各个时间点。
// Seek to the beginning of the file if (k4a_playback_seek_timestamp(playback_handle, 0, K4A_PLAYBACK_SEEK_BEGIN) != K4A_RESULT_SUCCEEDED) { return 1; } // Seek to the end of the file if (k4a_playback_seek_timestamp(playback_handle, 0, K4A_PLAYBACK_SEEK_END) != K4A_RESULT_SUCCEEDED) { return 1; } // Seek to 10 seconds from the start if (k4a_playback_seek_timestamp(playback_handle, 10 * 1000000, K4A_PLAYBACK_SEEK_BEGIN) != K4A_RESULT_SUCCEEDED) { return 1; } // Seek to 10 seconds from the end if (k4a_playback_seek_timestamp(playback_handle, -10 * 1000000, K4A_PLAYBACK_SEEK_END) != K4A_RESULT_SUCCEEDED) { return 1; }
读取标记信息
录制内容还可能包含各种元数据,例如设备序列号和固件版本。 此元数据存储在录制标记中,可以使用 函数来访问。
// Print the serial number of the device used to record char serial_number[256]; size_t serial_number_size = 256; k4a_buffer_result_t buffer_result = k4a_playback_get_tag(playback_handle, "K4A_DEVICE_SERIAL_NUMBER", &serial_number, &serial_number_size); if (buffer_result == K4A_BUFFER_RESULT_SUCCEEDED) { printf("Device serial number: %s\n", serial_number); } else if (buffer_result == K4A_BUFFER_RESULT_TOO_SMALL) { printf("Device serial number too long.\n"); } else { printf("Tag does not exist. Device serial number was not recorded.\n"); }
录制标记列表
下面是可以包含在录制文件中的所有默认标记的列表。 其中的许多值可用作 结构的一部分,可以使用 函数来读取。
如果某个标记不存在,则假设采用默认值。
标记名称 | 默认值 | 字段 | 备注 |
K4A_COLOR_MODE | "OFF" | color_format / color_resolution | 可能的值:"OFF"、"MJPG_1080P"、"NV12_720P"、"YUY2_720P" 等 |
K4A_DEPTH_MODE | "OFF" | depth_mode / depth_track_enabled | 可能的值:"OFF"、"NFOV_UNBINNED"、"PASSIVE_IR" 等 |
K4A_IR_MODE | "OFF" | depth_mode / ir_track_enabled | 可能的值:"OFF"、"ACTIVE"、"PASSIVE" |
K4A_IMU_MODE | "OFF" | imu_track_enabled | 可能的值:"ON"、"OFF" |
K4A_CALIBRATION_FILE | "calibration.json" | 不适用 | 请参见 |
K4A_DEPTH_DELAY_NS | "0" | depth_delay_off_color_usec | 值以纳秒为单位存储,API 以微秒为单位。 |
K4A_WIRED_SYNC_MODE | "STANDALONE" | wired_sync_mode | 可能的值:"STANDALONE"、"MASTER"、"SUBORDINATE" |
K4A_SUBORDINATE_DELAY_NS | "0" | subordinate_delay_off_master_usec | 值以纳秒为单位存储,API 以微秒为单位。 |
K4A_COLOR_FIRMWARE_VERSION | "" | 不适用 | 设备颜色固件版本,例如 "1.x.xx" |
K4A_DEPTH_FIRMWARE_VERSION | "" | 不适用 | 设备深度固件版本,例如 "1.x.xx" |
K4A_DEVICE_SERIAL_NUMBER | "" | 不适用 | 录制设备序列号 |
K4A_START_OFFSET_NS | "0" | start_timestamp_offset_usec | 请参阅下面的时间戳同步。 |
K4A_COLOR_TRACK | None | 不适用 | 请参阅 结构中提供。 |