Share via


A API de reprodução do Azure Kinect

O SDK do sensor fornece uma API para gravar dados do dispositivo num ficheiro Matroska (.mkv). O formato de contentor Matroska armazena faixas de vídeo, exemplos de IMU e calibragem de dispositivos. As gravações podem ser geradas com o utilitário de linha de comandos k4arecorder fornecido. As gravações também podem ser personalizadas e gravadas diretamente com a API de registos.

Para obter mais informações sobre a API de gravação, consulte k4a_record_create().

Para obter mais informações sobre as especificações de formato de ficheiro Matroska, consulte a página Formato de Ficheiro de Gravação .

Utilizar a API de reprodução

Os ficheiros de gravação podem ser abertos com a API de reprodução. A API de reprodução fornece acesso aos dados do sensor no mesmo formato que o resto do SDK do sensor.

Abrir um ficheiro de registo

No exemplo seguinte, abrimos uma gravação com k4a_playback_open(), imprime o comprimento da gravação e, em seguida, fechamos o ficheiro com 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);

Capturas de leitura

Assim que o ficheiro estiver aberto, podemos começar a ler capturas da gravação. Este exemplo seguinte irá ler cada uma das capturas no ficheiro.

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;
}

Procurar numa gravação

Assim que chegarmos ao fim do ficheiro, poderemos querer voltar atrás e lê-lo novamente. Este processo pode ser feito ao ler para trás com k4a_playback_get_previous_capture(), mas pode ser muito lento consoante o comprimento da gravação. Em vez disso, podemos utilizar a k4a_playback_seek_timestamp() função para aceder a um ponto específico no ficheiro.

Neste exemplo, especificamos carimbos de data/hora em microssegundos para procurar vários pontos no ficheiro.

// 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;
}

Ler informações da etiqueta

As gravações também podem conter vários metadados, como o número de série do dispositivo e versões de firmware. Estes metadados são armazenados em etiquetas de gravação, que podem ser acedidas com a k4a_playback_get_tag() função.

// 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");
}

Lista de etiquetas de registo

Segue-se uma lista de todas as etiquetas predefinidas que podem ser incluídas num ficheiro de gravação. Muitos destes valores estão disponíveis como parte da k4a_record_configuration_t estrutura e podem ser lidos com a k4a_playback_get_record_configuration() função.

Se não existir uma etiqueta, assume-se que tem o valor predefinido.

Nome da Etiqueta Valor Predefinido k4a_record_configuration_t Campo Notas
K4A_COLOR_MODE "DESATIVADO" color_format / color_resolution Valores possíveis: "OFF", "MJPG_1080P", "NV12_720P", "YUY2_720P" e assim sucessivamente
K4A_DEPTH_MODE "DESATIVADO" depth_mode / depth_track_enabled Valores possíveis: "OFF, "NFOV_UNBINNED", "PASSIVE_IR" e assim sucessivamente
K4A_IR_MODE "DESATIVADO" depth_mode / ir_track_enabled Valores possíveis: "OFF", "ACTIVE", "PASSIVE"
K4A_IMU_MODE "DESATIVADO" imu_track_enabled Valores possíveis: "ON", "OFF"
K4A_CALIBRATION_FILE "calibration.json" N/D Veja k4a_device_get_raw_calibration()
K4A_DEPTH_DELAY_NS "0" depth_delay_off_color_usec Valor armazenado em nanossegundos, a API fornece microssegundos.
K4A_WIRED_SYNC_MODE "AUTÓNOMO" wired_sync_mode Valores possíveis: "AUTÓNOMO", "MESTRE", "SUBORDINADO"
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec Valor armazenado em nanossegundos, a API fornece microssegundos.
K4A_COLOR_FIRMWARE_VERSION "" N/D Versão de firmware de cores do dispositivo, por exemplo "1.x.xx"
K4A_DEPTH_FIRMWARE_VERSION "" N/D Versão de firmware de profundidade do dispositivo, por exemplo "1.x.xx"
K4A_DEVICE_SERIAL_NUMBER "" N/D Gravar o número de série do dispositivo
K4A_START_OFFSET_NS "0" start_timestamp_offset_usec Veja Sincronização do Carimbo de Data /Hora abaixo.
K4A_COLOR_TRACK Nenhuma N/D Veja Gravação de Formato de Ficheiro – Identificar faixas.
K4A_DEPTH_TRACK Nenhuma N/D Veja Gravação de Formato de Ficheiro – Identificar faixas.
K4A_IR_TRACK Nenhuma N/D Veja Gravação de Formato de Ficheiro – Identificar faixas.
K4A_IMU_TRACK Nenhuma N/D Veja Gravação de Formato de Ficheiro – Identificar faixas.

Sincronização do carimbo de data/hora

O formato Matroska requer que as gravações comecem com um carimbo de data/hora de zero. Ao sincronizar externamente câmaras, o primeiro carimbo de data/hora de cada dispositivo pode não ser zero.

Para preservar os carimbos de data/hora originais dos dispositivos entre a gravação e a reprodução, o ficheiro armazena um desvio a aplicar aos carimbos de data/hora.

A K4A_START_OFFSET_NS etiqueta é utilizada para especificar um desvio de carimbo de data/hora para que os ficheiros possam ser ressincronizados após a gravação. Este desvio de carimbo de data/hora pode ser adicionado a cada carimbo de data/hora no ficheiro para reconstruir os carimbos de data/hora originais do dispositivo.

O desvio de início também está disponível na k4a_record_configuration_t estrutura.