비디오 표시 컨트롤 사용

[이 페이지에 설명된 구성 요소, 향상된 Video Renderer는 레거시 기능입니다. MediaPlayer 및 IMFMediaEngine 구성 요소를 통해 노출된 SVR(Simple Video Renderer)으로 대체되었습니다. 비디오 콘텐츠를 재생하려면 이러한 구성 요소 중 하나로 데이터를 보내고 새 비디오 렌더러를 인스턴스화하도록 허용해야 합니다. 이러한 구성 요소는 Windows 10 및 Windows 11에 최적화되었습니다. 가능한 경우 새 코드에서 MediaPlayer 또는 하위 수준 IMFMediaEngine API를 사용하여 EVR 대신 Windows에서 비디오 미디어를 재생하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

IMFVideoDisplayControl 인터페이스는 향상된 비디오 렌더러(EVR)가 애플리케이션 창 내에 비디오를 표시하는 방법을 제어합니다. 이 인터페이스는 DirectShow 또는 Media Foundation에서 사용할 수 있습니다. 내부적으로 비디오 표시 컨트롤은 EVR의 기본 발표자가 제공합니다. 사용자 지정 발표자를 작성하는 경우 동일한 인터페이스를 제공하거나 사용자 지정 인터페이스를 정의할 수 있습니다.

IMFVideoDisplayControl 인터페이스에 대한 포인터를 가져오는 올바른 방법은 DirectShow 버전의 EVR 또는 Media Foundation 버전을 사용하는지에 따라 달라집니다. Media Foundation EVR의 경우 EVR을 직접 사용하는지 또는 미디어 세션을 통해 사용하는지(더 일반적인) 여부에 따라 달라집니다.

IMFVideoDisplayControl 인터페이스에 대한 포인터를 얻으려면 다음을 수행합니다.

  1. IMFGetService 인터페이스에 대한 포인터를 가져옵니다.

    • DirectShow EVR 필터를 사용하는 경우 필터에서 QueryInterface를 호출합니다.

    • EVR 미디어 싱크를 직접 사용하는 경우 미디어 싱크에서 QueryInterface를 호출합니다.

    • 미디어 세션을 사용하는 경우 미디어 세션에서 QueryInterface를 호출합니다.

  2. 미디어 세션을 사용하는 경우 미디어 세션에서 상태 값이 MF_TOPOSTATUS_READY MESessionTopologyStatus 이벤트를 보낼 때까지 기다립니다. 그렇지 않으면 이 단계를 건너뜁니다.

  3. IMFGetService::GetService를 호출하여 IMFVideoDisplayControl 인터페이스를 가져옵니다. 서비스 식별자가 MR_VIDEO_RENDER_SERVICE.

IMFVideoDisplayControl 인터페이스를 사용하여 다음 작업을 수행할 수 있습니다.

  • 클리핑 창을 설정합니다.

  • 원본 및 대상 사각형을 설정합니다.

  • 창 메시지에 대한 응답으로 비디오 창을 업데이트합니다.

  • 전체 화면 모드를 사용하거나 사용하지 않도록 설정합니다.

클리핑 창

애플리케이션은 EVR이 비디오를 그리는 창을 제공해야 합니다. 클리핑 창을 설정하려면 애플리케이션 창에 대한 핸들을 사용하여 IMFVideoDisplayControl::SetVideoWindow를 호출합니다.

활성화 개체를 통해 EVR 미디어 싱크를 만드는 경우 이 단계가 필요하지 않습니다. 활성화 개체는 MFCreateVideoRendererActivate 함수에서 제공한 창 핸들을 사용하여 SetVideoWindow를 자동으로 호출합니다.

원본 및 대상 사각형

재생 중에 발표자는 합성된 비디오 이미지의 일부를 가져와 비디오 창의 영역에 그립니다. 복합 이미지의 부분은 원본 사각형이며 비디오 창의 영역은 대상 사각형입니다.

원본 사각형은 표준화된 좌표를 사용하여 정의됩니다. 여기서 점(0.0, 0.0)은 비디오의 왼쪽 위 모서리에 해당하고(1.0, 1.0)는 비디오의 오른쪽 아래 모서리에 해당합니다. 원본 사각형은 이 사각형 내의 모든 영역일 수 있습니다. 대상 사각형은 창의 클라이언트 영역을 기준으로 픽셀 단위로 지정됩니다. 기본 원본 사각형은 전체 이미지이며 기본 대상 사각형은 빈 사각형입니다.

원본 및 대상 사각형을 설정하려면 IMFVideoDisplayControl::SetVideoPosition을 호출 합니다.

활성화 개체를 통해 EVR 미디어 싱크를 만드는 경우 이 단계가 필요하지 않습니다. 활성화 개체는 대상 사각형을 창의 전체 클라이언트 영역과 자동으로 설정합니다. 그러나 원본 사각형을 변경하거나 다른 대상 사각형을 설정하려면 SetVideoPosition을 호출해야 합니다.

창 메시지

재생 중에 애플리케이션은 다음과 같이 특정 창 메시지에 응답해야 합니다.

  • WM_PAINT: IMFVideoDisplayControl::RepaintVideo를 호출하여 비디오를 다시 칠합니다. 또한 비디오가 재생되는 동안 대상 사각형 위에 그림을 그리지 마세요. 이 경우 깜박임이 발생할 수 있기 때문입니다.

  • WM_SIZE: SetVideoPosition을 호출하여 대상 사각형의 크기를 조정해야 할 수 있습니다.

DirectShow의 VMR(비디오 혼합 렌더러) 필터와 달리 WM_DISPLAYCHANGE 메시지를 받을 때 EVR에 알릴 필요가 없습니다.

향상된 비디오 렌더러