Gerçek Zamanlı Akışlar

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.