即時時間戳記
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
。節點 B
在 foo
中取得一個時間戳記為 T
的封包,正在等待
封包 (位於 alpha
時間戳記 T
)。如果 A
未傳送時間戳記範圍給 B
「alpha
」的更新,B
會持續等待封包在 alpha
送達。
與此同時,foo
的封包佇列會在 T
、T+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::Initialize
和
CalculatorGraph::StartRun
。您可以在
使用 CalculatorGraphConfig::OutputSidePackets
和
OutputSidePacket::Set
。
計算機:當所有輸入串流都變成 Done
時,就會叫用關閉
關閉或達到時間戳記上限 Timestamp::Done
。
注意:如果圖表完成所有待處理的計算機執行作業,並變成
Done
,那麼在部分串流變成 Done
之前,MediaPipe 就會叫用
其他對 Calculator::Close
的呼叫,因此每個計算機都可以產生其
最終輸出內容
使用 TimestampOffset
會對 Calculator::Close
有些影響。A 罩杯
指定 SetTimestampOffset(0)
計算機的設計信號,
而且當其所有輸入串流達到 Timestamp::Done
時
已升級至 Timestamp::Done
,因此無法再輸出任何內容。
這樣可以避免計算機在
Calculator::Close
。如果計算器在計算期間內需要產生摘要封包
Calculator::Close
、Calculator::Process
必須指定時間戳記範圍,例如
在這段時間內,至少有一個時間戳記 (例如 Timestamp::Max
)
Calculator::Close
。也就是說,這類計算機通常無法依賴
SetTimestampOffset(0)
,必須改為明確指定時間戳記範圍
使用 SetNextTimestampBounds()
。