Эта статья представляет мой проект «Хобби» — CaptureManager для настольной платформы Windows. Этот проект представляет собой простой набор функций (SDK), обеспечивающий поддержку широкого спектра источников видео и аудио в разрабатываемом приложении.
CaptureManager построен на Microsoft Media Foundation — новом поколении медиатехнологий, пришедших на смену объявленному устаревшим DirectShow. Microsoft Media Foundation впервые был включен в состав Windows Vista и получил поддержку источников видео и аудио начиная с Windows 7. Преимуществом Microsoft Media Foundation является новая модель конвейера обработки мультимедиа, оптимальная для многопроцессорных систем, а также ее постоянное развитие и поддержка со стороны Майкрософт. В проекте CaptureManager Мне хотелось решить ряд проблем, с которыми я столкнулся при написании приложений с использованием Microsoft Media Foundation:
- Реализация COM-функциональности.
Как бы странно это ни звучало, но с помощью технологии Microsoft Media Foundation компания Microsoft отошла от собственной модели приложений — от COM. Конечно, все интерфейсы классов в Microsoft Media Foundation по-прежнему являются производными от IUnknown и связаны с GUID. Но сами классы создаются посредством прямых вызовов функций «C» из статически связанных системных библиотек.
Это отличается от реализации DirectShow, которая требует вызова CoCreateInstance и вызывает через абстракцию COM. На мой взгляд, данное решение Microsoft является недостатком - во-первых, оно затрудняет интеграцию Microsoft Media Foundation в проекты, написанные не на C/C++, например проекты C#, которые, кстати, в Windows практически взаимодействуют с COM-объектами.
беспрепятственно генерируя необходимые определения интерфейсов из TLB. Во-вторых, возрастает риск потери совместимости приложения со следующей версией Windows при переносе функции из одной статически подключаемой библиотеки в другую — такое уже однажды произошло с Microsoft Media Foundation: Изменения библиотеки в Windows 7 — «Начиная с Windows 7, некоторые функции Media Foundation экспортируются из файлов DLL, отличных от предыдущих версий».
- На мой взгляд, Microsoft Media Foundation перегружен функциями и интерфейсами — большую часть из них неплохо было бы спрятать за дополнительным уровнем абстракции, чтобы оптимизировать задачу захвата и записи видео- и аудиоданных.
- Существенным недостатком, на мой взгляд, являются ограничения поддержки записи видео и аудио в Microsoft Media Foundation. Microsoft Media Foundation предоставляет два механизма работы с медиаданными: через топологию графа и SourceReader-SinkWriter .
Первый предполагает сборку необходимой конфигурации из узлов преобразователя и позволяет гибко настроить необходимую конфигурацию.
Второй предлагает получение порций медиаданных от SourceReader и отправить их в РаковинаПисатель в контексте разрабатываемого приложения.
Графовая топология, на мой взгляд, очень удобна и позволяет легко сформировать необходимую конфигурацию записи по желанию пользователя.
Однако данное решение от Microsoft не позволяет решить проблему записи — дело в том, что объект создания рабочего сеанса записи основан на топологии с интерфейсом МВФМедиасессия из функции Мфкреатемедиасессион оптимизирован для воспроизведения медиаданных, и не выполняет ряд обязательных операций - например, когда запись в файл завершена, необходимо рассчитать метрику - вычислить среднюю скорость потока и вычислить длительность воспроизведения - но МВФМедиасессия из функции Мфкреатемедиасессион этого не делает — для задачи воспроизводства операция вычисления метрик бессмысленна.
Еще есть проблема со сроками - МВФМедиасессия из функции Мфкреатемедиасессион считает начало воспроизведения с нулевого времени – это логично при воспроизведении медиафайла.
Однако источники видео и звука, такие как веб-камеры или микрофоны, используют текущее системное время — согласно документации Microsoft Media Foundation, они должны быть инициализированы нулевым значением времени, но они не соответствуют этому требованию.
Это и стало причиной запуска проекта CaptureManager (а также задача захвата видео с двух веб-камер и записи этого видео в один медиафайл).
Коротко что это такое CaptureManager :
- Полноценный COM In-Process Server — или как его иногда называют — ActiveX .
Он включает в себя TLB и может быть интегрирован в проекты C++, C#, Python вместе с DirectShow.
- CaptureManager связан с библиотеками Microsoft Media Foundation, но использует «ленивую компоновку» — библиотеки Microsoft Media Foundation загружаются в коде.
CaptureManager и связаны с соответствующими функциями во время выполнения приложения.
Если в библиотеках невозможно найти функцию, она заменяется на подключаемую функцию, возвращающую код ошибки — E_NOTIMPL .
Таким образом, CaptureManager позволяет снизить риск сбоя целевого приложения в ситуации, когда функции переносятся из одной библиотеки Microsoft Media Foundation в другую.
- CaptureManager имеет упрощенный набор интерфейсов.
Важной особенностью является формирование данных, описывающих медиа-источники, кодеки и медиа-контейнеры в формате XML-документа — обработка XML-документа намного проще, чем многочисленных Вариант И ПропВариант , особенно в API высокого уровня, таких как WPF.
- CaptureManager включает ряд источников видео и аудио, отсутствующих в исходной версии Microsoft Media Foundation: Скриншот – для захвата изображений с дисплея (или нескольких дисплеев), Захват аудиоцикла – для захвата аудиопотока с аудиовыхода, DirectShow-захват перекрестия – для захвата видео с карт видеозахвата.
- CaptureManager включает в себя «накопитель кадров», позволяющий получить серию крайних кадров.
- CaptureManager включает собственную реализацию МВФМедиасессия интерфейс оптимизирован под задачу записи - т.е.
реализовано полное отклонение вызова Мфкреатемедиасессион функции.
- CaptureManager включает функционал по изменению параметров видеопроцессора веб-камеры и параметров камеры (фокус, экспозиция и т. д.).
- CPPDдемо:
- EVRWebCapViewerViaCOMServer – простое приложение на C++ для демонстрации функциональности просмотра видеоисточников через CaptureManager рендерер.
- OpenGLWebCamViewerViaCOMServer – простое приложение на C++ для демонстрации функциональности просмотра видеоисточников через рендерер OpenGL.
- TextInjectorДемо – простое приложение на C++ для демонстрации функционала смешивания теста с видеопотоком с камеры.
- WaterMarkInjectorДемо – простое приложение на C++ для демонстрации функционала микширования изображения с видеопотоком с камеры.
- EVRПросмотр и запись – простое приложение на C++ для демонстрации функционала записи видео и аудио источников в один медиафайл.
- NativeMediaFoundationPlayer – простое приложение C++ для демонстрации воспроизведения нескольких видеофайлов в одном средстве визуализации.
- EVRWebCapViewerViaCOMServer – простое приложение на C++ для демонстрации функциональности просмотра видеоисточников через CaptureManager рендерер.
- CSharpDemos:
- WPFMultiSourceRecorder – простое приложение C# для демонстрации функциональности записи из одного, двух или более источников видео и аудио в один общий медиафайл.
- WPMediaFoundationPlayer – простое приложение C# для демонстрации воспроизведения нескольких видеофайлов в общем средстве визуализации.
- WPFVideoAndAudioRecorder – простое приложение C# для демонстрации функционала записи видео и аудио источников в один медиафайл.
- WPFIPCameraMJPEGMultiSourceViewer – простое приложение C# для демонстрации возможностей захвата видео с нескольких интернет-камер и его воспроизведения в общем рендерере.
- WPFMultiSourceViewer – простое приложение C# для демонстрации возможности захвата видео из нескольких и воспроизведения их в общем рендерере.
- WPFViewerEVRDisplay – простое приложение C# для демонстрации функциональности интеграции.
CaptureManager рендерер в приложении WPF.
- WPFIPCameraMJPEGViewer – простое приложение на C# для демонстрации возможностей захвата видео с интернет-камеры.
- WPFImageViewer – простое приложение C# для демонстрации возможностей захвата изображения из файла.
- WindowsFormsДемо – простое C#-приложение для демонстрации функционала просмотра и записи видеоисточников.
- WPFWebCamSerialShots – простое приложение C# для демонстрации функциональности «аккумулятора кадров».
- WPFWebCamShot – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника.
- WPFRRecorder – простое C#-приложение для демонстрации функционала просмотра и записи видеоисточников.
- WPFWebViewerEVR – простое приложение C# для демонстрации функциональности просмотра видеоисточников через CaptureManager рендерер.
- Обратный вызов WPFWebViewer – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника путем копирования из потока CaptureManager .
- WPFWebViewerCall – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника посредством прямых вызовов методов.
CaptureManager .
- WPFSourceInfoViewer – простое C#-приложение для демонстрации функционала получения информации о доступных источниках видео и аудио.
- WPFMultiSourceRecorder – простое приложение C# для демонстрации функциональности записи из одного, двух или более источников видео и аудио в один общий медиафайл.
- PythonДемо:
- CaptureManagerSDKPythonДемо – простое Python-приложение для демонстрации функционала просмотра и записи видеоисточников.
- CaptureManagerSDKPythonДемо – простое Python-приложение для демонстрации функционала просмотра и записи видеоисточников.
- QtMinGWDemos:
- CaptureManagerSDKQtMinGWDemo — простое C++-приложение на Qt для демонстрации функционала просмотра и записи видеоисточников.
- CaptureManagerSDKQtMinGWDemo — простое C++-приложение на Qt для демонстрации функционала просмотра и записи видеоисточников.
- UnityДемо:
- UnityWebCamViewer — простое приложение для демонстрации функционала работы с видеоисточником в Unity3D.
- UnityWebCamViewer — простое приложение для демонстрации функционала работы с видеоисточником в Unity3D.
На NuGet есть оболочка C# CaptureManager .
Теги: #видео #аудио #python #C++ #C++
-
Удобные Пароли Для Полиглотов
19 Oct, 24 -
Как Узнать Количество Видео На Youtube
19 Oct, 24 -
Искусственный Интеллект Horizon Zero Dawn
19 Oct, 24 -
Есть Спам? Спасибо Гэри Тьюрку.
19 Oct, 24 -
Можете Ли Вы Стать Настоящим Веб-Дизайнером?
19 Oct, 24