다음을 통해 공유


DirectShow에서 WDDM 캡처 사용

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

이 항목은 Windows Vista 이상에 적용됩니다.

일부 비디오 카드에는 비디오 캡처 기능이 통합되어 있습니다. 이러한 카드에서 캡처된 비디오 프레임은 비디오 메모리(VRAM)에 배치됩니다. Windows Vista 이전에는 VRAM에 남아 있는 동안 프레임을 처리하기 위한 표준 메커니즘이 없었습니다. 대신, 데이터를 시스템 메모리에 복사하고, 처리한 다음, 표시를 위해 VRAM에 다시 복사해야 했습니다. Windows Vista에서 DirectShow는 이제 비디오 프레임을 캡처에서 표시까지 처리 파이프라인 전체의 VRAM에 유지하는 메커니즘을 지원합니다.

KsProxy 필터는 드라이버에서 KSPROPERTY_PREFERRED_CAPTURE_SURFACE 속성에 대해 드라이버를 쿼리하여 VRAM 표면 캡처를 지원하는지 여부를 결정합니다. (이 속성은 Windows 드라이버 키트 설명서에 설명되어 있습니다.) 드라이버가 VRAM 표면 캡처를 지원하는 경우 KsProxy는 Direct3D 표면에 대한 포인터를 포함하는 특수한 종류의 미디어 샘플을 할당합니다.

다음으로 KsProxy는 다운스트림 필터가 다음과 같이 DXVA(DirectX Video Acceleration) 2.0을 지원하는지 여부를 결정합니다.

  1. KsProxy는 IMFGetService 인터페이스에 대한 다운스트림 입력 핀을 쿼리합니다.
  2. 핀이 IMFGetService를 노출하는 경우 KsProxy는 IDirect3DDeviceManager 인터페이스에 대해 IMFGetService::GetService를 호출합니다. 서비스 identier가 MR_VIDEO_ACCELERATION_SERVICE.

이러한 인터페이스는 모두 Media Foundation SDK 설명서에 설명되어 있습니다.

다운스트림 필터가 DXVA 2.0을 지원하지 않는 경우 KsProxy는 추가 시스템 메모리 버퍼를 할당합니다. 이 버퍼를 사용하여 VRAM에서 시스템 메모리로 비디오 프레임을 복사합니다. 미디어 샘플의 IMediaSample::GetPointer 메서드는 이 시스템 메모리 버퍼에 대한 포인터를 반환합니다.

그러나 다운스트림 필터가 DXVA 2.0을 지원하는 경우 KsProxy는 시스템 메모리 버퍼를 할당하지 않습니다. 이 경우 GetPointer 메서드는 E_NOTIMPL 반환합니다. 대신 다운스트림 필터는 샘플의 Direct3D 표면에 직접 액세스해야 합니다. 다운스트림 필터가 표면에 대한 포인터를 가져오는 방법에는 두 가지가 있습니다. 둘 다 동일합니다.

  • IMFGetService 인터페이스에 대한 샘플을 쿼리하고 IDirect3DSurface9 인터페이스에 대해 GetService를 호출합니다. 서비스 식별자가 MR_BUFFER_SERVICE.
  • IMediaSample2Config 인터페이스에 대한 샘플을 쿼리하고 IMediaSample2Config::GetSurface를 호출합니다.

고급 캡처 항목