录制和回放

本文内容

● 使用回放API

● 时间戳同步


传感器SDK提供了用于将设备数据录制到 Matroska (.mkv) 文件的 API 接口。 Matroska 容器格式可以存储视频数据、IMU数据和设备校准信息。您可以使用 k4arecorder 命令行工具进行录制,也可以直接使用录制 API 来录制内容。


有关录制 API 的详细信息,请参阅 

有关 Matroska 文件格式规范的详细信息,请参阅页。



使用回放 API

录制文件可以使用回放 API 进行录像回放。 通过回放 API 可以访问格式与 SDK 相同的传感器数据。


打开录制文件

在以下示例中,耀世将使用  打开一个录制文件,输出录制长度,然后使用  关闭该文件。

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

不适用

请参阅 结构中提供。