Gerçek zamanlı zaman damgaları
MediaPipe hesap makinesi grafikleri genellikle video veya ses akışlarını işlemek için kullanılır
çerçeveleri kullanabilirsiniz. MediaPipe çerçevesi yalnızca
ardışık paketlere tekdüze şekilde artan zaman damgaları atanır. Ölçüt
gerçek zamanlı hesap makineleri ve grafikler, kayıt süresini veya
zaman damgası olarak her karenin sunum süresini (her bir zaman damgası
Jan/1/1970:00:00:00 yılından itibaren geçen mikrosaniye. Bu şekilde, farklı konumlardan gelen paketler
kaynakların genel olarak tutarlı bir sırada işlenmesini sağlar.
Gerçek zamanlı planlama
Normalde her Hesap Makinesi, belirli bir veri için tüm giriş paketlerinin zaman damgası kullanılabilir hale gelir. Normalde bu durum, hesap makinesinin önceki kareyi işlemeyi bitirdiğini ve hesap makinelerinin her birinin girişlerinin geçerli kareyi işlemesi tamamlandı. MediaPipe planlayıcısı her hesap makinesini bu koşullar karşılandığı anda çağırır. Görüntüleyin Daha fazla ayrıntı için senkronizasyon.
Zaman damgası sınırları
Hesap makinesi, belirli bir zaman damgası için herhangi bir çıkış paketi üretmediğinde, bunun yerine "zaman damgası sınırlı" hiçbir paketin sunulmayacağını üretildiğini göreceksiniz. Bu gösterge, web sitesi tasarımının hiçbir paket teslim edilmemiş olsa bile, hesap makinelerinin ekleyebilirsiniz. Bu adım, özellikle de gerçek zamanlı ayrıntılı grafikler oluşturabilirsiniz. Bu yöntemde, her hesap makinesinin en kısa sürede işlemeye başlaması gerekir.
Aşağıdaki gibi bir grafiği inceleyin:
node {
calculator: "A"
input_stream: "alpha_in"
output_stream: "alpha"
}
node {
calculator: "B"
input_stream: "alpha"
input_stream: "foo"
output_stream: "beta"
}
Diyelim ki T zaman damgasında A düğümü kendi çıkış akışına paket göndermiyor
alpha. B düğümü, T zaman damgasında foo içinde bir paket alıyor ve ileti gönderilmesini bekliyor
alpha zaman damgası T zaman damgasında paket. A, B cihazına zaman damgası sınırı göndermezse
alpha için güncelleme yapılıyorsa B, alpha içinde bir paketin gelmesini beklemeye devam edecek.
Bu arada foo paket sırası, paket şuralarda toplayacak: T, T+1 ve
bu şekilde devam eder.
Hesap makinesi, akıştaki bir paketin çıktısını almak için API işlevlerini kullanır
CalculatorContext::Outputs ve OutputStream::Add. Bunun yerine
akışa bağlı zaman damgası varsa bir hesap makinesi,
CalculatorContext::Outputs ve CalculatorContext::SetNextTimestampBound. İlgili içeriği oluşturmak için kullanılan
belirtilen sınır, ağdaki bir sonraki paket için izin verilen en düşük zaman damgasıdır.
belirtilen çıkış akışı. Çıkışı yoksa hesap makinesi genellikle
aşağıdaki gibi bir işlem yapabilirsiniz:
cc->Outputs().Tag("output_frame").SetNextTimestampBound(
cc->InputTimestamp().NextAllowedInStream());
Timestamp::NextAllowedInStream işlevi sonraki zaman damgasını döndürür.
Örneğin, Timestamp(1).NextAllowedInStream() == Timestamp(2).
Yayılan zaman damgası sınırları
Gerçek zamanlı grafiklerde kullanılacak olan hesap makinelerinin çıkışı tanımlaması gerekir
aşağı akışa izin vermek için giriş zaman damgası sınırlarına dayanan zaman damgası sınırları
hesap makinelerini hemen planlayabilirsiniz. Hesap makinelerinin genellikle
çıkış paketleriyle aynı zaman damgalarına sahip
tüm çıkış paketlerini kullanın. Böyle durumlarda
Calculator::Process'a her çağrıda bir paket çıkışı yeterlidir
kullanabilirsiniz.
Ancak, hesap makinelerinin çıkış için bu ortak kalıbı izlemesi gerekmez yalnızca monoton olarak artan çıktıları seçmek için gereklidir. ekleyebilirsiniz. Bu nedenle, bazı hesaplayıcıların zaman damgası sınırlarını hesaplaması gerekir. açık bir şekilde belirtmelisiniz. MediaPipe, uygun zaman damgasını hesaplamak için çeşitli araçlar sunar. belirli bir sınır sınırı vardır.
1. Bir çıkış akışı için zaman damgası sınırını (t +
1) belirtmek amacıyla SetNextTimestampBound() kullanılabilir.
cc->Outputs.Tag("OUT").SetNextTimestampBound(t.NextAllowedInStream());
Alternatif olarak, t
zaman damgası sınırı t + 1.
cc->Outputs.Tag("OUT").Add(Packet(), t);
Giriş akışının zaman damgası sınırı, paket veya boş paketi haline getirir.
Timestamp bound = cc->Inputs().Tag("IN").Value().Timestamp();
2. TimestampOffset() giriş akışlarından çıkış akışlarına bağlı zaman damgası.
cc->SetTimestampOffset(0);
Bu ayar, zaman damgası sınırlarını otomatik olarak uygulama avantajına sahiptir. Yalnızca zaman damgası sınırları uygulandığında ve Hesap Makinesi::İşlem çağrılmadığında bile kullanılabilir.
3. ProcessTimestampBounds() öğesini çağırmak için belirtebilirsiniz.
her yeni "belirtilen zaman damgası" için Calculator::Process
timestamp" geçerli zaman damgası sınırlarının altındaki yeni en yüksek zaman damgasıdır.
ProcessTimestampBounds() olmadan Calculator::Process yalnızca
dair bir e-posta alırsınız.
cc->SetProcessTimestampBounds(true);
Bu ayar, hesap makinesinin kendi zaman damgası sınırı hesaplamasını yapmasına olanak tanır
ve yayılımını gösterir. Proje hedefi
TimestampOffset() etkisini çoğaltır ancak aynı zamanda aşağıdaki işlemler için de kullanılabilir:
Ek faktörleri hesaba katan bir zaman damgası sınırı hesaplar.
Örneğin, SetTimestampOffset(0) sayısını çoğaltmak için hesap makinesi
şunları yapın:
absl::Status Open(CalculatorContext* cc) {
cc->SetProcessTimestampBounds(true);
}
absl::Status Process(CalculatorContext* cc) {
cc->Outputs.Tag("OUT").SetNextTimestampBound(
cc->InputTimestamp().NextAllowedInStream());
}
Hesap Makinesi Zamanlaması::Açık ve Hesap Makinesi::Kapat
Calculator::Open, gerekli tüm giriş yan paketleri yapıldığında çağrılır
üretilir. Giriş yan paketleri, ilgili uygulama veya
"yan paket hesaplayıcılar" görebilirsiniz. Yan paketler şuradan belirtilebilir:
API'nin CalculatorGraph::Initialize ve
CalculatorGraph::StartRun. Yan paketler,
CalculatorGraphConfig::OutputSidePackets ve kullanılan grafik
OutputSidePacket::Set.
Hesap makinesi:: Tüm giriş akışları şu kadar Done olduğunda kapat çağrılır:
kapatılıyor veya zaman damgası sınırına (Timestamp::Done) ulaşılıyor.
Not: Grafikte, beklemedeki tüm hesap makinesi yürütme işlemleri biterse ve grafik,
Done sonrasında MediaPipe, bazı akışlar Done haline gelmeden önce
kalan çağrı sayısı Calculator::Close, böylece her hesap makinesi kendi
ve nihai çıkışlar
gibi unsurlardır.
TimestampOffset kullanımının Calculator::Close üzerinde bazı etkileri vardır. CEVAP
SetTimestampOffset(0) değerini belirten hesap makinesi, tasarım gereği tüm
çıkış akışları, tüm giriş akışlarına ulaştığında Timestamp::Done değerine ulaştı
Timestamp::Done sayısına ulaştı ve bu nedenle başka çıkış yapılamıyor.
Böylece, bu tür bir hesap makinesinin işlem sırasında paket
Calculator::Close Hesap makinesinin dönüşüm sırasında özet paketi üretmesi gerekiyorsa
Calculator::Close, Calculator::Process aşağıdaki gibi zaman damgası sınırlarını belirtmelidir:
sırasında en az bir zaman damgası (Timestamp::Max gibi) kullanılabilir
Calculator::Close Yani, normalde bu tür bir hesap makinesinin
SetTimestampOffset(0) ve bunun yerine zaman damgası sınırlarını açıkça belirtmelidir
SetNextTimestampBounds() kullanılıyor.