Sdk Capturemanager

Эта статья представляет мой проект «Хобби» — CaptureManager для настольной платформы Windows. Этот проект представляет собой простой набор функций (SDK), обеспечивающий поддержку широкого спектра источников видео и аудио в разрабатываемом приложении.

CaptureManager построен на Microsoft Media Foundation — новом поколении медиатехнологий, пришедших на смену объявленному устаревшим DirectShow. Microsoft Media Foundation впервые был включен в состав Windows Vista и получил поддержку источников видео и аудио начиная с Windows 7. Преимуществом Microsoft Media Foundation является новая модель конвейера обработки мультимедиа, оптимальная для многопроцессорных систем, а также ее постоянное развитие и поддержка со стороны Майкрософт. В проекте CaptureManager Мне хотелось решить ряд проблем, с которыми я столкнулся при написании приложений с использованием Microsoft Media Foundation:

  1. Реализация 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, отличных от предыдущих версий».

  2. На мой взгляд, Microsoft Media Foundation перегружен функциями и интерфейсами — большую часть из них неплохо было бы спрятать за дополнительным уровнем абстракции, чтобы оптимизировать задачу захвата и записи видео- и аудиоданных.

  3. Существенным недостатком, на мой взгляд, являются ограничения поддержки записи видео и аудио в Microsoft Media Foundation. Microsoft Media Foundation предоставляет два механизма работы с медиаданными: через топологию графа и SourceReader-SinkWriter .

    Первый предполагает сборку необходимой конфигурации из узлов преобразователя и позволяет гибко настроить необходимую конфигурацию.

    Второй предлагает получение порций медиаданных от SourceReader и отправить их в РаковинаПисатель в контексте разрабатываемого приложения.

    Графовая топология, на мой взгляд, очень удобна и позволяет легко сформировать необходимую конфигурацию записи по желанию пользователя.

    Однако данное решение от Microsoft не позволяет решить проблему записи — дело в том, что объект создания рабочего сеанса записи основан на топологии с интерфейсом МВФМедиасессия из функции Мфкреатемедиасессион оптимизирован для воспроизведения медиаданных, и не выполняет ряд обязательных операций - например, когда запись в файл завершена, необходимо рассчитать метрику - вычислить среднюю скорость потока и вычислить длительность воспроизведения - но МВФМедиасессия из функции Мфкреатемедиасессион этого не делает — для задачи воспроизводства операция вычисления метрик бессмысленна.

    Еще есть проблема со сроками - МВФМедиасессия из функции Мфкреатемедиасессион считает начало воспроизведения с нулевого времени – это логично при воспроизведении медиафайла.

    Однако источники видео и звука, такие как веб-камеры или микрофоны, используют текущее системное время — согласно документации Microsoft Media Foundation, они должны быть инициализированы нулевым значением времени, но они не соответствуют этому требованию.

Я считаю, и думаю, многие согласятся, что указанные проблемы существенны и желательно их решить.

Это и стало причиной запуска проекта CaptureManager (а также задача захвата видео с двух веб-камер и записи этого видео в один медиафайл).

Коротко что это такое CaptureManager :

  1. Полноценный COM In-Process Server — или как его иногда называют — ActiveX .

    Он включает в себя TLB и может быть интегрирован в проекты C++, C#, Python вместе с DirectShow.

  2. CaptureManager связан с библиотеками Microsoft Media Foundation, но использует «ленивую компоновку» — библиотеки Microsoft Media Foundation загружаются в коде.

    CaptureManager и связаны с соответствующими функциями во время выполнения приложения.

    Если в библиотеках невозможно найти функцию, она заменяется на подключаемую функцию, возвращающую код ошибки — E_NOTIMPL .

    Таким образом, CaptureManager позволяет снизить риск сбоя целевого приложения в ситуации, когда функции переносятся из одной библиотеки Microsoft Media Foundation в другую.

  3. CaptureManager имеет упрощенный набор интерфейсов.

    Важной особенностью является формирование данных, описывающих медиа-источники, кодеки и медиа-контейнеры в формате XML-документа — обработка XML-документа намного проще, чем многочисленных Вариант И ПропВариант , особенно в API высокого уровня, таких как WPF.

  4. CaptureManager включает ряд источников видео и аудио, отсутствующих в исходной версии Microsoft Media Foundation: Скриншот – для захвата изображений с дисплея (или нескольких дисплеев), Захват аудиоцикла – для захвата аудиопотока с аудиовыхода, DirectShow-захват перекрестия – для захвата видео с карт видеозахвата.

  5. CaptureManager включает в себя «накопитель кадров», позволяющий получить серию крайних кадров.

  6. CaptureManager включает собственную реализацию МВФМедиасессия интерфейс оптимизирован под задачу записи - т.е.

    реализовано полное отклонение вызова Мфкреатемедиасессион функции.

  7. CaptureManager включает функционал по изменению параметров видеопроцессора веб-камеры и параметров камеры (фокус, экспозиция и т. д.).

Функциональный CaptureManager представлено в демо-программах, доступных на GitHub — CaptureManager-SDK-демо :
  • CPPDдемо:
    1. EVRWebCapViewerViaCOMServer – простое приложение на C++ для демонстрации функциональности просмотра видеоисточников через CaptureManager рендерер.

    2. OpenGLWebCamViewerViaCOMServer – простое приложение на C++ для демонстрации функциональности просмотра видеоисточников через рендерер OpenGL.
    3. TextInjectorДемо – простое приложение на C++ для демонстрации функционала смешивания теста с видеопотоком с камеры.



      SDK CaptureManager

    4. WaterMarkInjectorДемо – простое приложение на C++ для демонстрации функционала микширования изображения с видеопотоком с камеры.



      SDK CaptureManager

    5. EVRПросмотр и запись – простое приложение на C++ для демонстрации функционала записи видео и аудио источников в один медиафайл.



      SDK CaptureManager

    6. NativeMediaFoundationPlayer – простое приложение C++ для демонстрации воспроизведения нескольких видеофайлов в одном средстве визуализации.



      SDK CaptureManager

  • CSharpDemos:
    1. WPFMultiSourceRecorder – простое приложение C# для демонстрации функциональности записи из одного, двух или более источников видео и аудио в один общий медиафайл.



      SDK CaptureManager

    2. WPMediaFoundationPlayer – простое приложение C# для демонстрации воспроизведения нескольких видеофайлов в общем средстве визуализации.



      SDK CaptureManager

    3. WPFVideoAndAudioRecorder – простое приложение C# для демонстрации функционала записи видео и аудио источников в один медиафайл.



      SDK CaptureManager

    4. WPFIPCameraMJPEGMultiSourceViewer – простое приложение C# для демонстрации возможностей захвата видео с нескольких интернет-камер и его воспроизведения в общем рендерере.



      SDK CaptureManager

    5. WPFMultiSourceViewer – простое приложение C# для демонстрации возможности захвата видео из нескольких и воспроизведения их в общем рендерере.



      SDK CaptureManager

    6. WPFViewerEVRDisplay – простое приложение C# для демонстрации функциональности интеграции.

      CaptureManager рендерер в приложении WPF.

      SDK CaptureManager

    7. WPFIPCameraMJPEGViewer – простое приложение на C# для демонстрации возможностей захвата видео с интернет-камеры.



      SDK CaptureManager

    8. WPFImageViewer – простое приложение C# для демонстрации возможностей захвата изображения из файла.



      SDK CaptureManager

    9. WindowsFormsДемо – простое C#-приложение для демонстрации функционала просмотра и записи видеоисточников.



      SDK CaptureManager

    10. WPFWebCamSerialShots – простое приложение C# для демонстрации функциональности «аккумулятора кадров».

    11. WPFWebCamShot – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника.

    12. WPFRRecorder – простое C#-приложение для демонстрации функционала просмотра и записи видеоисточников.



      SDK CaptureManager

    13. WPFWebViewerEVR – простое приложение C# для демонстрации функциональности просмотра видеоисточников через CaptureManager рендерер.



      SDK CaptureManager

    14. Обратный вызов WPFWebViewer – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника путем копирования из потока CaptureManager .



      SDK CaptureManager

    15. WPFWebViewerCall – простое приложение C# для демонстрации функциональности захвата кадров из видеоисточника посредством прямых вызовов методов.

      CaptureManager .



      SDK CaptureManager

    16. WPFSourceInfoViewer – простое C#-приложение для демонстрации функционала получения информации о доступных источниках видео и аудио.



      SDK CaptureManager

  • PythonДемо:
    1. CaptureManagerSDKPythonДемо – простое Python-приложение для демонстрации функционала просмотра и записи видеоисточников.



      SDK CaptureManager

  • QtMinGWDemos:
    1. CaptureManagerSDKQtMinGWDemo — простое C++-приложение на Qt для демонстрации функционала просмотра и записи видеоисточников.



      SDK CaptureManager

  • UnityДемо:
    1. UnityWebCamViewer — простое приложение для демонстрации функционала работы с видеоисточником в Unity3D.

      SDK CaptureManager

Более подробную информацию о проекте можно найти на сайте SDK диспетчера захвата .

На NuGet есть оболочка C# CaptureManager .

Теги: #видео #аудио #python #C++ #C++

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.