다음을 통해 공유


1단계. 기본 클래스 선택

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

변환 필터 작성 자습서의 1단계입니다.

DMO가 아닌 필터를 작성하기로 결정했다고 가정하면 첫 번째 단계는 사용할 기본 클래스를 선택하는 것입니다. 다음 클래스는 변환 필터에 적합합니다.

  • CTransformFilter 는 별도의 입력 및 출력 버퍼를 사용하는 변환 필터용으로 설계되었습니다. 이러한 종류의 필터를 복사 변환 필터라고도 합니다. 복사 변환 필터는 입력 샘플을 받으면 출력 샘플에 새 데이터를 쓰고 출력 샘플을 다음 필터에 전달합니다.

  • CTransInPlaceFilter 는 원래 버퍼의 데이터를 수정하는 필터(현재 위치 간 필터라고도 함)를 위해 설계되었습니다. 현재 위치 변환 필터는 샘플을 받으면 해당 샘플 내의 데이터를 변경하고 동일한 샘플 다운스트림을 제공합니다. 필터의 입력 핀 및 출력 핀은 항상 일치하는 미디어 유형과 연결합니다.

  • CVideoTransformFilter 는 주로 비디오 디코더용으로 설계되었습니다. CTransformFilter에서 파생되지만 다운스트림 렌더러가 뒤처지는 경우 프레임을 삭제하는 기능이 포함되어 있습니다.

  • CBaseFilter 는 제네릭 필터 클래스입니다. 이 목록의 다른 클래스는 모두 CBaseFilter에서 파생됩니다. 적합한 클래스가 없으면 이 클래스를 다시 사용할 수 있습니다. 그러나 이 클래스에는 가장 많은 작업이 필요합니다.

  • ! [중요]

    현재 위치 비디오 변환은 렌더링 성능에 심각한 영향을 미칠 수 있습니다. 현재 위치 변환에는 버퍼에 대한 읽기-수정-쓰기 작업이 필요합니다. 메모리가 그래픽 카드 있는 경우 읽기 작업이 상당히 느립니다. 또한 신중하게 구현하지 않으면 복사 변환에서도 의도하지 않은 읽기 작업이 발생할 수 있습니다. 따라서 비디오 변환을 작성하는 경우 항상 성능 테스트를 수행해야 합니다.

     

예제 RLE 인코더의 경우 가장 좋은 선택은 CTransformFilter 또는 CVideoTransformFilter입니다. 사실, 둘 사이의 차이는 대부분 내부적이므로 한 쪽에서 다른 것으로 쉽게 변환할 수 있습니다. 두 핀에서 미디어 유형이 달라야 하므로 CTransInPlaceFilter 클래스는 이 필터에 적합하지 않습니다. 이 예제에서는 CTransformFilter를 사용합니다.

다음: 2단계. Filter 클래스를 선언합니다.

DirectShow 필터 작성