Прежде чем использовать MediaPipe Framework, ознакомьтесь со следующими понятиями.
Основы
Пакет
Базовая единица потока данных. Пакет состоит из числовой отметки времени и общего указателя на неизменяемую полезную нагрузку. Полезная нагрузка может быть любого типа C++, а тип полезной нагрузки также называется типом пакета. Пакеты представляют собой ценные классы, и их можно дешево скопировать. Каждая копия разделяет право собственности на полезную нагрузку с семантикой подсчета ссылок. Каждая копия имеет свою временную метку. См. также Пакет .
График
Обработка MediaPipe происходит внутри графа, который определяет пути потока пакетов между узлами . Граф может иметь любое количество входов и выходов, а поток данных может разветвляться и сливаться. Обычно данные передаются вперед, но возможны и обратные циклы. Подробности см. в разделе Графики .
Узлы
Узлы производят и/или потребляют пакеты, и именно на них происходит основная часть работы графа. По историческим причинам их также называют «калькуляторами». Интерфейс каждого узла определяет количество входных и выходных портов , идентифицируемых тегом и/или индексом. Подробнее см. Калькуляторы .
Потоки
Поток — это соединение между двумя узлами, передающее последовательность пакетов, временные метки которых должны монотонно возрастать.
Боковые пакеты
Побочное пакетное соединение между узлами передает один пакет (с неопределенной меткой времени). Его можно использовать для предоставления некоторых данных, которые останутся постоянными, тогда как поток представляет собой поток данных, который меняется со временем.
Пакетные порты
Порт имеет связанный тип; пакеты, проходящие через порт, должны быть именно этого типа. Порт выходного потока может быть подключен к любому количеству портов входного потока того же типа; каждый потребитель получает отдельную копию выходных пакетов и имеет свою собственную очередь, поэтому может потреблять их в своем собственном темпе. Аналогично, дополнительный порт вывода пакетов может быть подключен к любому количеству дополнительных портов ввода пакетов.
Порт может быть обязательным, то есть для того, чтобы граф был действительным, необходимо установить соединение, или необязательным, то есть он может оставаться неподключенным.
Ввод и вывод
Поток данных может исходить от узлов-источников , которые не имеют входных потоков и создают пакеты спонтанно (например, путем чтения из файла); или из входных потоков графа , которые позволяют приложению подавать пакеты в граф.
Аналогичным образом существуют узлы-приемники , которые получают данные и записывают их в различные места назначения (например, в файл, буфер памяти и т. д.), а приложение также может получать выходные данные из графа с помощью обратных вызовов .
Поведение во время выполнения
Время жизни графа
После инициализации графа его можно запустить для обработки данных и обрабатывать поток пакетов до тех пор, пока каждый поток не будет закрыт или граф не будет отменен . Затем граф можно уничтожить или запустить заново.
Время жизни узла
Существует три основных метода времени жизни, которые платформа будет вызывать на узле:
- Открытый: вызывается один раз перед другими методами. При его вызове все пакеты входной стороны, необходимые узлу, будут доступны.
- Процесс: вызывается несколько раз, когда доступен новый набор входных данных в соответствии с политикой ввода узла.
- Close: вызывается один раз, в конце.
Кроме того, каждый калькулятор может определять конструктор и деструктор, которые полезны для создания и освобождения ресурсов, независимых от обрабатываемых данных.
Политика ввода
Политика ввода по умолчанию — детерминированная сортировка пакетов по меткам времени. Узел получает все входные данные для одной и той же временной метки одновременно при вызове своего метода Process; и последующие входные наборы принимаются в порядке их временных меток. Это может потребовать задержки обработки некоторых пакетов до тех пор, пока пакет с одинаковой меткой времени не будет получен во всех входных потоках или пока не будет гарантировано, что пакет с этой меткой времени не будет поступать в потоки, которые его не получили.
Также доступны другие политики, реализованные с использованием отдельного компонента, известного как InputStreamHandler.
Дополнительную информацию см. в разделе Синхронизация .
Потоки в реальном времени
Графики калькулятора MediaPipe часто используются для обработки потоков видео или аудио кадров для интерактивных приложений. Обычно каждый калькулятор запускается, как только становятся доступными все его входные пакеты для данной временной метки. Калькуляторам, используемым в графиках реального времени, необходимо определять границы выходных меток времени на основе границ входных меток времени, чтобы обеспечить быстрое планирование последующих калькуляторов. Подробности см. в разделе «Потоки в реальном времени» .
,Прежде чем использовать MediaPipe Framework, ознакомьтесь со следующими понятиями.
Основы
Пакет
Базовая единица потока данных. Пакет состоит из числовой отметки времени и общего указателя на неизменяемую полезную нагрузку. Полезная нагрузка может быть любого типа C++, а тип полезной нагрузки также называется типом пакета. Пакеты представляют собой ценные классы, и их можно дешево скопировать. Каждая копия разделяет право собственности на полезную нагрузку с семантикой подсчета ссылок. Каждая копия имеет свою временную метку. См. также Пакет .
График
Обработка MediaPipe происходит внутри графа, который определяет пути потока пакетов между узлами . Граф может иметь любое количество входов и выходов, а поток данных может разветвляться и сливаться. Обычно данные передаются вперед, но возможны и обратные циклы. Подробности см. в разделе Графики .
Узлы
Узлы производят и/или потребляют пакеты, и именно на них происходит основная часть работы графа. По историческим причинам их также называют «калькуляторами». Интерфейс каждого узла определяет количество входных и выходных портов , идентифицируемых тегом и/или индексом. Подробности см. в разделе Калькуляторы .
Потоки
Поток — это соединение между двумя узлами, передающее последовательность пакетов, временные метки которых должны монотонно увеличиваться.
Боковые пакеты
Побочное пакетное соединение между узлами передает один пакет (с неопределенной меткой времени). Его можно использовать для предоставления некоторых данных, которые останутся постоянными, тогда как поток представляет собой поток данных, который меняется со временем.
Пакетные порты
Порт имеет связанный тип; пакеты, проходящие через порт, должны быть именно этого типа. Порт выходного потока может быть подключен к любому количеству портов входного потока того же типа; каждый потребитель получает отдельную копию выходных пакетов и имеет свою собственную очередь, поэтому он может потреблять их в своем собственном темпе. Аналогично, дополнительный порт вывода пакетов может быть подключен к любому количеству дополнительных портов ввода пакетов.
Порт может быть обязательным, то есть для того, чтобы граф был действительным, необходимо установить соединение, или необязательным, то есть он может оставаться неподключенным.
Ввод и вывод
Поток данных может исходить от узлов-источников , которые не имеют входных потоков и создают пакеты спонтанно (например, путем чтения из файла); или из входных потоков графа , которые позволяют приложению подавать пакеты в граф.
Аналогичным образом существуют узлы-приемники , которые получают данные и записывают их в различные места назначения (например, в файл, буфер памяти и т. д.), а приложение также может получать выходные данные из графа с помощью обратных вызовов .
Поведение во время выполнения
Время жизни графа
После инициализации графа его можно запустить для обработки данных и обрабатывать поток пакетов до тех пор, пока каждый поток не будет закрыт или граф не будет отменен . Затем граф можно уничтожить или запустить заново.
Время жизни узла
Существует три основных метода времени жизни, которые платформа будет вызывать на узле:
- Открытый: вызывается один раз перед другими методами. При его вызове все пакеты входной стороны, необходимые узлу, будут доступны.
- Процесс: вызывается несколько раз, когда доступен новый набор входных данных в соответствии с политикой ввода узла.
- Close: вызывается один раз, в конце.
Кроме того, каждый калькулятор может определять конструктор и деструктор, которые полезны для создания и освобождения ресурсов, независимых от обрабатываемых данных.
Политика ввода
Политика ввода по умолчанию — детерминированная сортировка пакетов по меткам времени. Узел получает все входные данные для одной и той же временной метки одновременно при вызове своего метода Process; и последующие входные наборы принимаются в порядке их временных меток. Это может потребовать задержки обработки некоторых пакетов до тех пор, пока пакет с одинаковой меткой времени не будет получен во всех входных потоках или пока не будет гарантировано, что пакет с этой меткой времени не будет поступать в потоки, которые его не получили.
Также доступны другие политики, реализованные с использованием отдельного компонента, известного как InputStreamHandler.
Дополнительную информацию см. в разделе Синхронизация .
Потоки в реальном времени
Графики калькулятора MediaPipe часто используются для обработки потоков видео или аудио кадров для интерактивных приложений. Обычно каждый калькулятор запускается, как только становятся доступными все его входные пакеты для данной временной метки. Калькуляторам, используемым в графиках реального времени, необходимо определять границы выходных меток времени на основе границ входных меток времени, чтобы обеспечить быстрое планирование последующих калькуляторов. Подробности см. в разделе «Потоки в реальном времени» .