即時串流

即時時間戳記

MediaPipe 計算機圖形通常用於處理影片或音訊串流 互動式應用程式的頁框MediaPipe 架構只需要 連續封包的時間戳記會單調遞增。變更者: 即時計算機和圖表使用記錄時間或 每個影格的顯示時間當做時間戳記,每個時間戳記表示 毫秒 (自 Jan/1/1970:00:00:00 起)這樣就能 按照全球一致性順序處理這些來源

即時排程

一般而言,對於每個計算器的指定封包所有輸入封包,每個計算機都會立刻執行 時間戳記可以使用。一般情況下,當計算機 因此處理完前一個影格 且輸入已完成處理目前的影格MediaPipe 排程器 只要符合這些條件,就會立即叫用每個計算機。詳情請見 同步處理

時間戳記範圍

如果計算機沒有產生任何指定時間戳記的輸出封包, 可以改為輸出「時間戳記範圍」表示沒有任何封包 各個時間戳記產生的 YAML 檔案有此跡象才是讓下游 在該時間戳記執行的計算機,即使 與該時間戳記相關的部分串流這對即時交易來說特別重要 互動式應用程式中的圖表,但每個計算工具都必須 我們會盡快處理。

假設某張圖表如下所示:

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。節點 Bfoo 中取得一個時間戳記為 T 的封包,正在等待 封包 (位於 alpha 時間戳記 T)。如果 A 未傳送時間戳記範圍給 Balpha」的更新,B 會持續等待封包在 alpha 送達。 與此同時,foo 的封包佇列會在 TT+1 和 依此類推

為了在串流中輸出封包,計算機會使用 API 函式 《CalculatorContext::Outputs》和《OutputStream::Add》。如果要改為輸出 如果是串流,計算器可以使用 API 函式 《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);

這項設定具有自動傳播時間戳記範圍的優勢。 且即使只有時間戳記邊界到達,且計算器並未叫用「計算機」。

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 產生的結果。輸入端封包可透過封閉式應用程式提供,或 「內裝計算機」圖表內的文字可以在 在圖表外使用 API 的 CalculatorGraph::InitializeCalculatorGraph::StartRun。您可以在 使用 CalculatorGraphConfig::OutputSidePacketsOutputSidePacket::Set

計算機:當所有輸入串流都變成 Done 時,就會叫用關閉 關閉或達到時間戳記上限 Timestamp::Done

注意:如果圖表完成所有待處理的計算機執行作業,並變成 Done,那麼在部分串流變成 Done 之前,MediaPipe 就會叫用 其他對 Calculator::Close 的呼叫,因此每個計算機都可以產生其 最終輸出內容

使用 TimestampOffset 會對 Calculator::Close 有些影響。A 罩杯 指定 SetTimestampOffset(0) 計算機的設計信號, 而且當其所有輸入串流達到 Timestamp::Done 時 已升級至 Timestamp::Done,因此無法再輸出任何內容。 這樣可以避免計算機在 Calculator::Close。如果計算器在計算期間內需要產生摘要封包 Calculator::CloseCalculator::Process 必須指定時間戳記範圍,例如 在這段時間內,至少有一個時間戳記 (例如 Timestamp::Max) Calculator::Close。也就是說,這類計算機通常無法依賴 SetTimestampOffset(0),必須改為明確指定時間戳記範圍 使用 SetNextTimestampBounds()