الطوابع الزمنية في الوقت الفعلي
غالبًا ما تُستخدم الرسوم البيانية للآلة الحاسبة MediaPipe لمعالجة عمليات بث الفيديو أو الصوت
والإطارات للتطبيقات التفاعلية. لا يتطلب إطار عمل MediaPipe سوى
تعيين الطوابع الزمنية المتتالية بشكل رتيب وزيادة الطوابع الزمنية. من
الحاسبات والرسوم البيانية في الوقت الفعلي باستخدام وقت التسجيل أو
وقت العرض لكل إطار كطابع زمني له، مع إشارة كل طابع زمني
بالميكرو ثانية منذ Jan/1/1970:00:00:00
. يسمح هذا للحزم من مختلف
المصادر أن تتم معالجتها في تسلسل متناسق عالميًا.
جدولة في الوقت الفعلي
عادةً، تعمل كل حاسبة بمجرد أن يتم تشغيل جميع حزم الإدخال الخاصة بها أصبح الطابع الزمني متاحًا. وعادةً، يحدث هذا عندما تحتوي الآلة الحاسبة على الانتهاء من معالجة الإطار السابق، وكل حاسبات تنتج انتهت إدخالاته من معالجة الإطار الحالي. أداة جدولة MediaPipe باستدعاء كل حاسبة بمجرد استيفاء هذه الشروط. عرض المزامنة لمزيد من التفاصيل.
حدود الطابع الزمني
عندما لا تنتج الآلة الحاسبة أي حزم إخراج بطابع زمني معين، يمكنه بدلاً من ذلك إخراج "مرتبط بالطابع الزمني" مما يشير إلى أنه لن يتم تحديث التي تم إنتاجها لهذا الطابع الزمني. هذا المؤشر ضروري للسماح ببدء تشغيل الجهاز تشغيل آلات حاسبة عند ذلك الطابع الزمني، على الرغم من عدم وصول أي حزمة أحداث بث معيّنة لهذا الطابع الزمني وهذا مهم بشكل خاص في الوقت الفعلي والرسوم البيانية في التطبيقات التفاعلية، حيث يكون من الضروري أن تكون كل حاسبة وبدء المعالجة في أقرب وقت ممكن
ضع في الاعتبار رسمًا بيانيًا مثل ما يلي:
node {
calculator: "A"
input_stream: "alpha_in"
output_stream: "alpha"
}
node {
calculator: "B"
input_stream: "alpha"
input_stream: "foo"
output_stream: "beta"
}
فرضًا: عند الطابع الزمني T
، لا ترسل العقدة A
حزمة في بث الناتج
alpha
تحصل العقدة B
على حزمة في foo
عند الطابع الزمني T
وهي في انتظار الرد
الحزمة في alpha
عند الطابع الزمني T
. في حال لم يرسل A
طابعًا زمنيًا إلى B
تحديث لـ alpha
، سيواصل B
انتظار وصول الحزمة خلال alpha
.
في هذه الأثناء، ستجمّع قائمة انتظار حزم foo
حزم البيانات في T
وT+1
و
وهكذا.
لإخراج حزمة على بث، تستخدم الآلة الحاسبة دوال واجهة برمجة التطبيقات
"CalculatorContext::Outputs
" وOutputStream::Add
" بدلاً من ذلك، يمكنك
الطابع الزمني المرتبط بالبث، يمكن للآلة الحاسبة استخدام وظائف واجهة برمجة التطبيقات
"CalculatorContext::Outputs
" وCalculatorContext::SetNextTimestampBound
" تشير رسالة الأشكال البيانية
المحدد هو أدنى طابع زمني مسموح به للحزمة التالية على
بث إخراج محدد. في حالة عدم إخراج أي حزمة، ستجري الآلة الحاسبة عادةً
فعل شيء مثل:
cc->Outputs().Tag("output_frame").SetNextTimestampBound(
cc->InputTimestamp().NextAllowedInStream());
تعرض الدالة Timestamp::NextAllowedInStream
الطابع الزمني المتتالي.
مثلاً: Timestamp(1).NextAllowedInStream() == Timestamp(2)
نشر حدود الطوابع الزمنية
تحتاج الآلات الحاسبة التي سيتم استخدامها في الرسوم البيانية في الوقت الفعلي إلى تحديد المخرجات
حدود الطابع الزمني استنادًا إلى حدود الطابع الزمني للإدخال من أجل السماح بانتقال البيانات
جدولة الآلات الحاسبة على الفور. هناك نمط شائع هو أن تقوم الحاسبات
حزم الإخراج التي لها الطوابع الزمنية نفسها لحزم الإدخال. وفي هذه الحالة،
يكفي إخراج حزمة عند كل استدعاء للحقل Calculator::Process
لتحديد حدود الطابع الزمني للمخرجات.
ومع ذلك، لا يلزم استخدام الحاسبات لاتباع هذا النمط الشائع للمخرجات الطوابع الزمنية، يجب فقط اختيار زيادة الإخراج بشكل رتيب الطوابع الزمنية. نتيجةً لذلك، يجب أن تحسب بعض آلات حاسبة حدود الطابع الزمني. بشكل صريح. يوفر MediaPipe عدة أدوات لحساب الطابع الزمني المناسب المرتبطة بكل حاسبة.
1. يمكن استخدام SetNextTimestampBound() لتحديد ارتباط الطابع الزمني، t +
1
، لمصدر بيانات الناتج.
cc->Outputs.Tag("OUT").SetNextTimestampBound(t.NextAllowedInStream());
بدلاً من ذلك، يمكن إنشاء حزمة فارغة بالطابع الزمني t
لتحديد
تم ربط الطابع الزمني t + 1
.
cc->Outputs.Tag("OUT").Add(Packet(), t);
يُشار إلى الطابع الزمني لمصدر بيانات مصدرها الحزمة أو الحقل الفارغ. الحزمة في تدفق الإدخال.
Timestamp bound = cc->Inputs().Tag("IN").Value().Timestamp();
2. يمكن تحديد TimestampOffset() لنسخ الطابع الزمني المرتبط من مصادر بيانات الإدخال إلى مصادر البيانات الناتجة.
cc->SetTimestampOffset(0);
ويتميز هذا الإعداد بميزة نشر حدود الطابع الزمني تلقائيًا، حتى عند وصول حدود الطابع الزمني فقط ولم يتم استدعاء Calculator::Process.
3- يمكن تحديد ProcessTimestampBounds() لاستدعاء.
Calculator::Process
لكل "طابع زمني تمت تسويته" جديد، حيث تمت تسوية
timestamp" هو أعلى طابع زمني جديد أسفل حدود الطابع الزمني الحالية.
بدون ProcessTimestampBounds()
، يتم استدعاء Calculator::Process
فقط من خلال
حزمة وصول واحدة أو أكثر.
cc->SetProcessTimestampBounds(true);
يتيح هذا الإعداد للآلة الحاسبة طريقة حساب حدود الطابع الزمني الخاصة بها.
والنشر، حتى في حال تعديل الطوابع الزمنية للإدخال فقط يمكن استخدامها
تكرار تأثير TimestampOffset()
، ولكن يمكن أيضًا استخدامه
حساب طابع زمني يراعي عوامل إضافية.
على سبيل المثال، إذا أردت نسخ SetTimestampOffset(0)
، استخدمت الآلة الحاسبة
قم بما يلي:
absl::Status Open(CalculatorContext* cc) {
cc->SetProcessTimestampBounds(true);
}
absl::Status Process(CalculatorContext* cc) {
cc->Outputs.Tag("OUT").SetNextTimestampBound(
cc->InputTimestamp().NextAllowedInStream());
}
جدولة الآلة الحاسبة::فتح والآلة الحاسبة::إغلاق
يتم استدعاء Calculator::Open
عند تنفيذ جميع حزم الإدخال الجانبية المطلوبة
إنتاجه. يمكن توفير حزم الإدخال الجانبية بواسطة تطبيق التضمين أو من خلال
"حاسبات الحزم الجانبية" داخل الرسم البياني. يمكن تحديد الحزم الجانبية من
خارج الرسم البياني باستخدام CalculatorGraph::Initialize
لواجهة برمجة التطبيقات
CalculatorGraph::StartRun
يمكن تحديد الحزم الجانبية عن طريق الآلات الحاسبة ضمن
الرسم البياني باستخدام CalculatorGraphConfig::OutputSidePackets
OutputSidePacket::Set
الحاسبة::يتم استدعاء "إغلاق" عندما تصبح جميع ساحات المشاركات للإدخال Done
بواسطة
الإغلاق أو الوصول إلى الطابع الزمني Timestamp::Done
.
ملاحظة: إذا أنهى الرسم البياني جميع عمليات تنفيذ الآلة الحاسبة في انتظار المراجعة، وأصبح
Done
، قبل أن تتحوّل بعض مجموعات البث إلى Done
، يستدعي MediaPipe
الاستدعاءات المتبقية إلى Calculator::Close
، بحيث يمكن لكل حاسبة إعداد
والمخرجات النهائية.
لاستخدام "TimestampOffset
" بعض التأثيرات في "Calculator::Close
". حاسمة
ستعمل الآلة الحاسبة التي تحدد SetTimestampOffset(0)
حسب التصميم على أن تشير جميع
وصلت مصادر بياناتها إلى Timestamp::Done
عند وصول كل مصادر البيانات التي تم إدخالها
وصلت إلى Timestamp::Done
، وبالتالي لا يمكننا الحصول على نتائج أخرى.
يمنع هذا الحاسبة من إطلاق أي حزم أثناء
Calculator::Close
إذا كانت الآلة الحاسبة تحتاج إلى إنتاج حزمة ملخص أثناء
Calculator::Close
، يجب أن يحدّد Calculator::Process
حدود الطابع الزمني على النحو التالي
أن طابعًا زمنيًا واحدًا على الأقل (مثل Timestamp::Max
) يظل متاحًا أثناء
Calculator::Close
وهذا يعني أن هذه الحاسبة لا يمكنها عادةً الاعتماد على
SetTimestampOffset(0)
ويجب أن يحدد حدود الطابع الزمني بشكل صريح بدلاً من ذلك
باستخدام SetNextTimestampBounds()
.