本文内容
● 使用回放API
● 功夫戳同步
传感器SDK提供了用于将设备数据录造到 Matroska (.mkv) 文件的 API 接口。。。。。。 Matroska 容器体式能够存储视频数据、IMU数据和设备校准信息。。。。。。您能够使用 k4arecorder 号令行工具进行录造,,,,,,,也能够直接使用录造 API 来录造内容。。。。。。
有关录造 API 的具体信息,,,,,,,请参阅 k4a_record_create()。。。。。。
有关 Matroska 文件体式规范的具体信息,,,,,,,请参阅录造文件体式页。。。。。。
使用回放 API
录造文件能够使用回放 API 进行录像回放。。。。。。 通过回放 API 能够接见体式与 SDK 一样的传感器数据。。。。。。
打开录造文件
在以下示例中,,,,,,,我们将使用 k4a_playback_open() 打开一个录造文件,,,,,,,输出录造长度,,,,,,,而后使用 k4a_playback_close() 关关该文件。。。。。。
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;
}
在录造内容中查找
达到文件末尾后,,,,,,,我们可能必要返回并再次读取。。。。。。 若要实现此过程,,,,,,,能够使用 k4a_playback_get_previous_capture() 进行回读,,,,,,,但凭据录造内容的长度,,,,,,,这种做法可能非;;;;;郝!!。。。 我们能够改用 k4a_playback_seek_timestamp() 函数转到文件中的功夫点。。。。。。
在此示例中,,,,,,,我们以微秒为单元指定了功夫戳,,,,,,,以定位到文件中的各个功夫点。。。。。。
// 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;
}
读取象征信息
录造内容还可能蕴含各类元数据,,,,,,,例如设备序列号和固件版本。。。。。。 此元数据存储在录造象征中,,,,,,,能够使用 k4a_playback_get_tag() 函数来接见。。。。。。
// 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_record_configuration_t 结构的一部门,,,,,,,能够使用 k4a_playback_get_record_configuration() 函数来读取。。。。。。
若是某个象征不存在,,,,,,,则如果选取默认值。。。。。。
象征名称 | 默认值 | k4a_record_configuration_t 字段 | 备注 |
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_device_get_raw_calibration() |
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 | 不合用 | 请参阅录造文件体式 - 鉴别篇目。。。。。。 |
K4A_DEPTH_TRACK | None | 不合用 | 请参阅录造文件体式 - 鉴别篇目。。。。。。 |
K4A_IR_TRACK | None | 不合用 | 请参阅录造文件体式 - 鉴别篇目。。。。。。 |
K4A_IMU_TRACK | None | 不合用 | 请参阅录造文件体式 - 鉴别篇目。。。。。。 |
功夫戳同步
Matroska 体式要求录造内容必须以功夫戳 0 开头。。。。。。 使用多机同步时,,,,,,,每个设备中的第一个功夫戳能够不为 0。。。。。。
为了在录造和播放之间切换时保留设备的原始功夫戳,,,,,,,该文件会存储一个要利用到功夫戳的偏移量。。。。。。
K4A_START_OFFSET_NS 象征用于指按功夫戳偏移量,,,,,,,以便在录造后能够沉新同步文件。。。。。。 可将此功夫戳偏移量增长到文件中的每个功夫戳,,,,,,,以沉新机关原始设备功夫戳。。。。。。
肇始偏移量也会在 k4a_record_configuration_t 结构中提供。。。。。。