Я хочу создать простейшее приложение для виртуальной веб-камеры, которое может выводить любое изображение или видео на виртуальную камеру. Эта виртуальная камера должна быть видна как видеоустройство на онлайн-встречах, таких как Google Meet или Zoom.
В Windows нет поддержки виртуальных веб-камер в качестве унифицированного API, и то, что вы пытаетесь достичь, в целом возможно, но намного сложнее, чем вопрос настройки.
Задачу можно разделить на три части, и вы сможете найти прошлые вопросы StackOverflow, которые подробно описывают все три (некоторые ссылки приведены ниже).
Во-первых, необходимо решить проблему интеграции виртуальной камеры в стороннее программное обеспечение. Согласно заявлению, с которого я начал, API ОС не предлагает возможности для универсального интерфейса виртуальной камеры с точки зрения точки расширения ОС, которая позволяет стороннему приложению видеть новое устройство камеры.
Популярным способом внедрения поддельной камеры в приложения является виртуальный источник видео DirectShow (и, соответственно, Vivek's Исходный код VCam).
Схема из Регистрация сетевого видеопотока в качестве виртуальной камеры описывает API-интерфейсы, используемые приложениями для работы с камерами, и иллюстрирует ограничения виртуальные камеры DirectShow, в частности, почему они не видны всем приложениям с поддержкой видео в Windows.
См. Также вопросы Виртуальная камера водителя не распознается браузером и Фильтр DirectShow не отображается как устройство ввода данных.
В общем, чтобы разработать виртуальную веб-камеру для всех и любого приложения в Windows, вам потребуется разработать драйвер, с чем немногие готовы иметь дело.
Newer Media Foundation API не предлагает ничего, что могло бы помочь с функциональностью виртуальной веб-камеры.
Во-вторых, вам необходимо определить метод внедрения видеокадров в любую виртуальную камеру, которую вы разрабатываете. Нет необходимости использовать DirectShow или Media Foundation, потому что в конце концов все, что вам нужно, - это отправить видеокадры на серверную часть реализации вашей виртуальной камеры, и вы можете использовать любой удобный метод.
Использование DirectShow для этой задачи в целом имеет смысл, но вам это не нужно. Если вы не знакомы с API и начинаете с основ создания графа фильтров, то вполне вероятно, что проще выбрать решение, отличное от DirectShow. Если вам нужно добавить в ленту реальное изображение с веб-камеры, вы можете сделать это, в частности, с помощью Media Foundation. Если вы планируете использовать своего рода сервисы GPU, Media Foundation будет лучшим API для повторного использования. DirectShow по-прежнему остается хорошим вариантом в качестве API для построения вашего конвейера.
В-третьих, часто возникает вопрос о межпроцессном взаимодействии для связи реализации виртуальной камеры и источника видео. В некоторых случаях в этом нет необходимости, но чаще об этом просто забывают.
Виртуальная камера DirectShow (или виртуальная камера Media Foundation, если вы, например, будете объезжать) работает в контексте процесса потребления камеры, и к камерам в целом можно получить доступ из нескольких приложений, в том числе одновременно. Довольно часто вы ожидаете создания видео из другого [единственного] приложения, в том числе в случае применения разблокировки битности / архитектуры, поэтому вы должны позаботиться о передаче данных между процессами. Если вы пытаетесь разработать драйвер для виртуальной камеры, у вас тоже будет такая же задача.
Я упомянул аспекты этого в вопросе MSDN: Как реализовать исходный фильтр для разделения видео с камеры на основе vcam Vivek?, затем там Прочтите входное изменение USB-камеры и отправьте выходные данные на виртуальную камеру в Windows, а также там Как создать фильтр Directshow?.
В общем, вопрос не в настройке проекта. Вместо этого, это набор довольно сложных проблем, которые необходимо решить (которые, тем не менее, выполнимы, и мы видим примеры этого).
person
Roman R.
schedule
13.01.2021