Antes de usar o MediaPipe Framework, familiarize-se com os conceitos a seguir.
Conceitos básicos
Pacote
A unidade de fluxo de dados básica. Um pacote consiste em um carimbo de data/hora numérico e um ponteiro compartilhado para um payload imutável. O payload pode ser de qualquer tipo C++, e o tipo do payload também é chamado de tipo do pacote. Os pacotes são classes de valor e podem ser copiados de forma econômica. Cada cópia compartilha a propriedade do payload, com semântica de contagem de referência. Cada cópia tem seu próprio carimbo de data/hora. Consulte também Pacote.
Gráfico
O processamento do MediaPipe ocorre dentro de um gráfico, que define caminhos de fluxo de pacotes entre nós. Um gráfico pode ter qualquer número de entradas e saídas, e o fluxo de dados pode ramificar e mesclar. Geralmente, os dados fluem adiante, mas é possível retornar loops. Consulte Gráficos para obter mais detalhes.
Nós
Os nós produzem e/ou consomem pacotes, e são neles que ocorre a maior parte do trabalho do grafo. Elas também são conhecidas como "calculadoras", por motivos históricos. A interface de cada nó define várias ports de entrada e saída, identificadas por uma tag e/ou um índice. Consulte Calculadoras para ver mais detalhes.
Streams
Um stream é uma conexão entre dois nós que carregam uma sequência de pacotes, com carimbos de data/hora que precisam aumentar monotonicamente.
Pacotes laterais
Uma conexão de pacote lateral entre nós carrega um único pacote (com carimbo de data/hora não especificado). Ele pode ser usado para fornecer dados que permanecerão constantes, enquanto um stream representa um fluxo de dados que muda ao longo do tempo.
Portas de pacotes
Uma porta tem um tipo associado, e os pacotes que transitam por ela precisam ser desse tipo. Uma porta de stream de saída pode ser conectada a qualquer número de portas de stream de entrada do mesmo tipo. Cada consumidor recebe uma cópia separada dos pacotes de saída e tem a própria fila para consumi-los no próprio ritmo. Da mesma forma, uma porta de saída de pacote lateral pode ser conectada a quantas portas de entrada de pacote lateral você quiser.
Uma porta pode ser necessária, o que significa que uma conexão precisa ser feita para que o gráfico seja válido, ou opcional, o que significa que ele pode permanecer desconectado.
Entrada e saída
O fluxo de dados pode ser originado de nós de origem, que não têm streams de entrada e produzem pacotes espontaneamente (por exemplo, lendo um arquivo) ou de fluxos de entrada de gráfico, que permitem que um aplicativo alimente pacotes em um gráfico.
Da mesma forma, há nós de coletor que recebem dados e os gravam em vários destinos (por exemplo, um arquivo, um buffer de memória etc.), e um aplicativo também pode receber a saída do gráfico usando callbacks.
Comportamento do tempo de execução
Ciclo de vida do gráfico
Depois de inicializado, o gráfico pode ser iniciado para começar a processar dados e pode processar um stream de pacotes até que cada stream seja fechado ou o gráfico seja cancelado. Em seguida, o gráfico pode ser destruído ou iniciado novamente.
Ciclo de vida do nó
Há três métodos principais de ciclo de vida que o framework chamará em um nó:
- Open: chamado uma vez, antes dos outros métodos. Quando é chamado, todos os pacotes do lado de entrada exigidos pelo nó estarão disponíveis.
- Processo: chamado várias vezes, quando um novo conjunto de entradas está disponível, de acordo com a política de entrada do nó.
- Close: chamado uma vez, no final.
Além disso, cada calculadora pode definir o construtor e o destrutor, que são úteis para criar e desalocar recursos independentes dos dados processados.
Políticas de entrada
A política de entrada padrão é um agrupamento determinístico de pacotes por carimbo de data/hora. Um nó recebe todas as entradas para o mesmo carimbo de data/hora ao mesmo tempo, em uma invocação do método Process. Conjuntos de entradas sucessivos são recebidos na ordem do carimbo de data/hora. Isso pode exigir o atraso do processamento de alguns pacotes até que um pacote com o mesmo carimbo de data/hora seja recebido em todos os streams de entrada ou até que seja possível garantir que um pacote com esse carimbo de data/hora não chegará aos fluxos que não o receberam.
Outras políticas também estão disponíveis, implementadas usando um tipo separado de componente conhecido como InputStreamHandler.
Consulte Sincronização para mais detalhes.
Transmissões em tempo real
Os gráficos da calculadora do MediaPipe geralmente são usados para processar streams de frames de vídeo ou áudio em aplicativos interativos. Normalmente, cada calculadora é executada assim que todos os pacotes de entrada para um determinado carimbo de data/hora ficam disponíveis. As calculadoras usadas em gráficos em tempo real precisam definir limites do carimbo de data/hora de saída com base nos limites do carimbo de data/hora de entrada para permitir que as calculadoras downstream sejam programadas imediatamente. Consulte Transmissões em tempo real para saber mais detalhes.