Поделиться через


Создание фильтров DirectShow

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Для реализации фильтров DirectShow рекомендуется использовать базовые классы DirectShow. Чтобы выполнить сборку с использованием базовых классов, выполните следующие действия в дополнение к действиям, перечисленным в разделе Настройка среды сборки.

  • Создайте библиотеку базовых классов, расположенную в каталоге Samples\Multimedia\DirectShow\BaseClasses, в корневом каталоге пакета SDK. Существует две версии библиотеки: розничная версия (Strmbase.lib) и отладочная версия (Strmbasd.lib).
  • Включите файл заголовка Streams.h.
  • Используйте соглашение о вызовах __stdcall.
  • Используйте многопоточную библиотеку времени выполнения C (отладочную или розничную, при необходимости).
  • Включите файл определения (DEF- файл), который экспортирует функции DLL. Ниже приведен пример файла определения. Предполагается, что выходной файл называется MyFilter.dll.
LIBRARY MYFILTER.DLL
EXPORTS 
    DllMain             PRIVATE
    DllGetClassObject   PRIVATE
    DllCanUnloadNow     PRIVATE
    DllRegisterServer   PRIVATE
    DllUnregisterServer PRIVATE
  • Ссылка на следующие lib-файлы.
Метка Значение
Отладочная сборка Strmbasd.lib, Msvcrtd.lib, Winmm.lib
Розничная сборка Strmbase.lib, Msvcrt.lib, Winmm.lib
  • Выберите параметр "Игнорировать библиотеки по умолчанию" в параметрах компоновщика.
  • Объявите точку входа DLL в исходном коде следующим образом:
extern "C" BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
    return DllEntryPoint((HINSTANCE)(hModule), dwReason, lpReserved);
}

Предыдущие версии

Для версий библиотеки базовых классов до DirectShow 9.0 необходимо также выполнить следующие действия:

  • Для отладочных сборок определите флаг препроцессора DEBUG.

Этот шаг не требуется для версии библиотеки базовых классов, доступной в DirectShow 9.0 и более поздних версиях.

Базовые классы DirectShow

Написание фильтров DirectShow