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.