واجهة برمجة تطبيقات تشغيل Azure Kinect

توفر عدة تطوير برامج أداة الاستشعار واجهة برمجة تطبيقات لتسجيل بيانات الجهاز إلى ملف بتنسيق Matroska (mkv.). يخزن تنسيق حاوية Matroska مقاطع الفيديو وعينات IMU ومعايرة الجهاز. يمكن إنشاء التسجيلات باستخدام أداة سطر الأوامر المساعدة المتوفرة k4arecorder. كذلك يمكن تخصيص التسجيلات وتسجيلها مباشرةً باستخدام واجهة برمجة تطبيقات التسجيل.

لمزيد من المعلومات حول واجهة برمجة تطبيقات التسجيل، راجع k4a_record_create().

لمزيد من المعلومات حول مواصفات تنسيق الملفات Matroska، راجع صفحة تنسيق ملفات التسجيل.

استخدام واجهة برمجة التطبيقات الخاصة بالتشغيل

يمكن فتح ملفات التسجيل باستخدام واجهة برمجة التطبيقات الخاصة بالتشغيل. توفر واجهة برمجة تطبيقات التشغيل إمكانية الوصول إلى بيانات أداة الاستشعار بنفس تنسيق بقية عدة تطوير برامج أداة الاستشعار.

فتح ملف تسجيل

في المثال التالي، نفتح تسجيلاً باستخدام 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);

قراءة اللقطات المُسجَّلة

بمجرد فتح الملف، يمكننا بدء قراءة اللقطات المُسجَّلة من التسجيل. في هذا المثال التالي، نقرأ كل لقطة من اللقطات في الملف.

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 يتم تخزين القيمة بالنانو ثانية، وتوفر واجهة برمجة التطبيقات قيم ميكرو ثانية.
K4A_WIRED_SYNC_MODE "STANDALONE" wired_sync_mode القيم المحتملة: "STANDALONE" و"MASTER" و"SUBORDINATE"
K4A_SUBORDINATE_DELAY_NS "0" subordinate_delay_off_master_usec يتم تخزين القيمة بالنانو ثانية، وتوفر واجهة برمجة التطبيقات قيم ميكرو ثانية.
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 بلا غير متوفر راجع تنسيق ملف التسجيل - تحديد المقاطع.
K4A_DEPTH_TRACK بلا غير متوفر راجع تنسيق ملف التسجيل - تحديد المقاطع.
K4A_IR_TRACK بلا غير متوفر راجع تنسيق ملف التسجيل - تحديد المقاطع.
K4A_IMU_TRACK بلا غير متوفر راجع تنسيق ملف التسجيل - تحديد المقاطع.

مزامنة الطابع الزمني

يتطلب تنسيق Matroska أن تبدأ التسجيلات بطابع زمني قيمته صفر. عند مزامنة الكاميرات خارجياً، يمكن أن يكون الطابع الزمني الأول من كل جهاز غير صفري.

للاحتفاظ بالطوابع الزمنية الأصلية المأخوذة من الأجهزة فيما بين التسجيل والتشغيل، يخزن الملف إزاحةً لتطبيقها على الطوابع الزمنية.

تُستخدم العلامة K4A_START_OFFSET_NS لتحديد إزاحة طابع زمني بحيث يمكن إعادة مزامنة الملفات بعد التسجيل. يمكن إضافة إزاحة الطابع الزمني هذه إلى كل طابع زمني في الملف لإعادة إنشاء الطوابع الزمنية الأصلية للأجهزة.

تتوفر إزاحة البدء أيضاً في البنية k4a_record_configuration_t.