DirectShow 필터 개발 소개

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 섹션에서는 사용자 지정 DirectShow 필터 개발과 관련된 작업에 대한 간략한 개요를 제공합니다. 또한 이러한 작업을 자세히 설명하는 topics 대한 링크를 제공합니다. 이 섹션을 읽기 전에 DirectShow 정보에서 전체 DirectShow 아키텍처를 설명하는 topics 읽어보세요.

DirectShow 기본 클래스 라이브러리

DirectShow SDK에는 필터 작성을 위한 C++ 클래스 집합이 포함되어 있습니다. 필수는 아니지만 이러한 클래스는 새 필터를 작성하는 데 권장되는 방법입니다. 기본 클래스를 사용하려면 DirectShow 필터 빌드에 설명된 대로 기본 클래스를 정적 라이브러리로 컴파일하고 .lib 파일을 프로젝트에 연결합니다.

기본 클래스 라이브러리는 필터에 대한 루트 클래스인 CBaseFilter 클래스를 정의합니다. 다른 여러 클래스는 CBaseFilter에서 파생되며 특정 종류의 필터에 대해 특수화됩니다. 예를 들어 CTransformFilter 클래스는 변환 필터용으로 설계되었습니다. 새 필터를 만들려면 필터 클래스 중 하나에서 상속되는 클래스를 구현합니다. 예를 들어 클래스 선언은 다음과 같습니다.

class CMyFilter : public CTransformFilter
{
private:
    /* Declare variables and methods that are specific to your filter.
public:
    /* Override various methods in CTransformFilter */
};

DirectShow 기본 클래스에 대한 자세한 내용은 다음 topics 참조하세요.

핀 만들기

필터는 하나 이상의 핀을 만들어야 합니다. 디자인 타임에 핀 수를 수정하거나 필터에서 필요에 따라 새 핀을 만들 수 있습니다. 핀은 일반적으로 CBasePin 클래스 또는 CBaseInputPin과 같은 CBasePin을 상속하는 클래스에서 파생됩니다. 필터의 핀은 필터 클래스에서 멤버 변수로 선언되어야 합니다. 일부 필터 클래스는 이미 핀을 정의하지만 필터가 CBaseFilter에서 직접 상속되는 경우 파생 클래스에서 핀을 선언해야 합니다.

핀 연결 협상

필터 그래프 관리자가 두 개의 필터를 연결하려고 하면 핀이 다양한 항목에 동의해야 합니다. 연결할 수 없는 경우 연결 시도가 실패합니다. 일반적으로 핀은 다음을 협상합니다.

  • 전송. 전송은 필터가 출력 핀에서 입력 핀으로 미디어 샘플을 이동하는 데 사용하는 메커니즘입니다. 예를 들어 IMemInputPin 인터페이스("푸시 모델") 또는 IAsyncReader 인터페이스("끌어오기 모델")를 사용할 수 있습니다.
  • 미디어 유형입니다. 거의 모든 핀은 미디어 형식을 사용하여 배달할 데이터의 형식을 설명합니다.
  • 할당자. 할당자는 데이터를 보유하는 버퍼를 만드는 개체입니다. 핀은 할당자를 제공할 핀에 동의해야 합니다. 또한 버퍼 크기, 만들 버퍼 수 및 기타 버퍼 속성에 동의해야 합니다.

기본 클래스는 이러한 협상을 위한 프레임워크를 구현합니다. 기본 클래스의 다양한 메서드를 재정의하여 세부 정보를 완료해야 합니다. 재정의해야 하는 메서드 집합은 클래스 및 필터의 기능에 따라 달라집니다. 자세한 내용은 필터 연결 방법을 참조하세요.

데이터 처리 및 제공

대부분의 필터의 기본 기능은 미디어 데이터를 처리하고 전달하는 것입니다. 이 문제는 필터 유형에 따라 달라집니다.

  • 푸시 소스에는 데이터를 사용하여 샘플을 지속적으로 채우고 다운스트림으로 제공하는 작업자 스레드가 있습니다.
  • 끌어오기 원본은 다운스트림 인접 항목이 샘플을 요청할 때까지 기다립니다. 샘플에 데이터를 쓰고 샘플을 다운스트림 필터에 전달하여 응답합니다. 다운스트림 필터는 데이터 흐름을 구동하는 스레드를 만듭니다.
  • 변환 필터에는 업스트림 인접 항목에서 제공하는 샘플이 있습니다. 샘플을 받으면 데이터를 처리하고 다운스트림으로 전달합니다.
  • 렌더러 필터는 업스트림 샘플을 수신하고 타임스탬프를 기반으로 렌더링되도록 예약합니다.

스트리밍과 관련된 다른 작업에는 그래프에서 데이터를 플러시하고, 스트림의 끝을 처리하고, 요청 검색에 응답하는 작업이 포함됩니다. 이러한 문제에 대한 자세한 내용은 다음 topics 참조하세요.

COM 지원

DirectShow 필터는 일반적으로 DLL에 패키지된 COM 개체입니다. 기본 클래스 라이브러리는 COM을 지원하기 위한 프레임워크를 구현합니다. DirectShow 및 COM 섹션에 설명되어 있습니다.

DirectShow 필터 작성