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


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

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

Базовые классы DirectShow рекомендуется использовать для реализации фильтров DirectShow. Чтобы работать с базовыми классами, выполните следующие действия, в дополнение к шагам, перечисленным в Setting Up the Build Environment:

  • Создайте библиотеку базовых классов, расположенную в каталоге 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 также необходимо выполнить следующие действия:

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

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

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

разработка фильтров DirectShow