在使用 MediaPipe 框架之前,请先熟悉以下概念。
基础知识
包
基本数据流单元。数据包由数字时间戳和指向不可变载荷的共享指针组成。载荷可以是任何 C++ 类型,载荷的类型也称为数据包类型。数据包是值类,能够以低廉的费用进行复制。每个副本都拥有载荷的所有权,并且具有引用计数语义。每个副本都有自己的时间戳。另请参阅数据包。
图表
MediaPipe 处理在图表内部进行,该图表定义了节点之间的数据包流路径。一个图可以有任意数量的输入和输出,并且数据流可以分支和合并。通常,数据向前流动,但也可能发生后向循环。如需了解详情,请参阅图表。
节点
节点生成和/或使用数据包,是图中大部分工作发生的位置。由于历史原因,它们也称为“计算器”。 每个节点的接口会定义多个输入和输出端口ports,由标记和/或索引来标识。如需了解详情,请参阅计算器。
数据流
数据流是两个带有一系列数据包的节点之间的连接,其时间戳必须单调递增。
侧边数据包
节点之间的边包连接携带单个数据包(未指定时间戳)。它可用于提供一些将保持不变的数据,而数据流则代表随时间变化的数据流。
数据包端口
端口具有关联的类型;通过该端口传输的数据包必须是该类型。输出流端口可以连接到任意数量的相同类型输入流端口;每个使用方都会收到单独的输出数据包副本,并且有自己的队列,因此可以按照自己的节奏来消耗这些数据包。同样,您可以根据需要将侧边数据包输出端口连接到任意数量的侧边数据包输入端口。
端口可以是必需项,表示必须建立连接才能使图表有效;或者,可以选择性连接(表示连接可能保持未连接状态)。
输入和输出
数据流可以来自没有输入流并自发生成数据包(例如,通过读取文件)的源节点;或者来自图输入流,可让应用将数据包馈送到图中。
同样,有接收数据并将其写入各种目的地(例如文件、内存缓冲区等)的接收器节点,应用也可以使用回调从图接收图输出。
运行时行为
图表生命周期
初始化后,图便可开始处理数据,并且可以处理数据包流,直到每个流关闭或图被取消为止。然后,该图可以被销毁或再次启动。
节点生命周期
框架将在节点上调用以下三种主要的生命周期方法:
- 开放:在其他方法之前调用一次。调用该方法时,节点所需的所有输入端数据包都将可用。
- 处理:根据节点的输入政策,当有一组新的输入可用时多次调用。
- Close:在结束时调用一次。
此外,每个计算器都可以定义构造函数和析构函数,这对于创建和取消分配与处理后的数据无关的资源非常有用。
输入政策
默认输入政策是按时间戳对数据包进行确定性排序。节点在调用其 Process 方法时,会同时接收同一时间戳的所有输入;连续的输入集按其时间戳顺序接收。这可能需要延迟某些数据包的处理,直到所有输入流上收到具有相同时间戳的数据包,或者可以保证具有该时间戳的数据包不会到达尚未收到它的数据流。
您还可以使用其他政策,这些政策使用名为 InputStreamHandler 的单独组件实现。
有关详情,请参阅同步。
实时视频流
MediaPipe 计算器图表通常用于处理交互式应用的视频或音频帧流。通常,每个计算器都会在给定时间戳的所有输入数据包可用时立即运行。实时图表中使用的计算器需要根据输入时间戳边界定义输出时间戳边界,以便及时安排下游计算器。如需了解详情,请参阅实时数据流。