Video Mixer 컨트롤 사용

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

EVR 믹서는 애플리케이션이 믹서가 비디오를 처리하는 방법을 제어하는 데 사용할 수 있는 여러 인터페이스를 제공합니다. 이러한 인터페이스는 DirectShow 또는 Media Foundation에서 사용할 수 있습니다.

인터페이스 설명
IMFVideoMixerBitmap 인터페이스 정적 비트맵 이미지를 비디오에 알파 혼합합니다.
IMFVideoMixerControl 인터페이스 EVR이 비디오 하위 스트림을 혼합하는 방법을 제어합니다.
IMFVideoProcessor 인터페이스 색 조정, 이미지 필터 및 기타 비디오 처리 기능을 제어합니다. 이 인터페이스는 그래픽 드라이버에서 구현하는 기능에 대한 액세스를 제공하므로 정확한 기능은 사용자의 그래픽 드라이버에 따라 달라집니다.

 

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

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

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

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

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

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

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

  3. IMFGetService::GetService를 호출하여 믹서 인터페이스를 가져옵니다. 서비스 식별자 MR_VIDEO_MIXER_SERVICE 사용합니다.

비디오에 비트맵 혼합 알파

IMFVideoMixerBitmap 인터페이스를 사용하여 재생 중에 정적 비트맵을 비디오에 알파 혼합할 수 있습니다. IDirect3DSurface9 포인터로 지정된 Direct3D 화면에 비트맵을 저장하거나 GDI 비트맵을 사용할 수 있습니다.

비트맵에 Direct3D 표면을 사용하는 경우 표면은 픽셀당 알파 데이터를 포함할 수 있으며, 이 데이터는 믹서가 이미지를 알파 혼합할 때 사용됩니다. 또는 색 키를 정의할 수 있습니다. 즉, 비트맵에 표시되는 모든 위치에서 투명하게 단일 색을 정의할 수 있습니다. 또한 전체 이미지에 적용할 알파 값을 지정할 수 있습니다. 비트맵을 자르도록 원본 사각형을 설정하고 대상 사각형을 설정하여 비트맵을 비디오 프레임 내에 배치할 수도 있습니다.

비트맵을 설정하려면 IMFVideoMixerBitmap::SetAlphaBitmap을 호출합니다. 이 메서드는 비트맵 및 알파 혼합 매개 변수를 지정하는 MFVideoAlphaBitmap 구조체에 대한 포인터를 사용합니다. 예제 코드는 SetAlphaBitmap 메서드에 대한 참조 항목을 참조하세요.

비트맵을 설정한 후 IMFVideoMixerBitmap::UpdateAlphaBitmapParameters를 호출 하여 원본 및 대상 사각형을 포함한 혼합 매개 변수를 업데이트할 수 있습니다. 업데이트는 다음 비디오 프레임에 적용됩니다. 업데이트가 수행되려면 비디오를 재생해야 합니다. 이 메서드를 사용하여 비트맵에서 간단한 애니메이션을 수행할 수 있습니다. (더 정교한 효과가 필요한 경우 사용자 지정 EVR 믹서를 작성하는 것이 좋습니다.)

비트맵을 지우려면 IMFVideoMixerBitmap::ClearAlphaBitmap을 호출합니다.

하위 스트림 제어

EVR은 하나 이상의 비디오 하위 스트림을 기본 비디오 스트림에 혼합할 수 있습니다. 서브스트림 혼합을 제어하려면 IMFVideoMixerControl 인터페이스를 사용합니다.

  • IMFVideoMixerControl::SetStreamOutputRect를 호출하여 복합 비디오 프레임 내에서 하위 스트림의 위치를 설정합니다.

  • IMFVideoMixerControl::SetStreamZOrder를 호출하여 하위 스트림에 대한 z 순서를 설정합니다. EVR은 0부터 시작하여 z 순서 값 순서로 비디오 스트림을 그립니다. 기본 비디오 스트림은 항상 z 순서에서 첫 번째입니다.

비디오 프로세서 설정

EVR 믹서는 DXVA(DirectX Video Acceleration)를 사용하여 입력 스트림에서 비디오 처리를 수행합니다. 정확한 처리 기능은 그래픽 드라이버에 따라 달라집니다. 비디오 처리 기능은 DXVA2_VideoProcessorCaps 구조를 사용하여 설명합니다. 특정 기능 집합을 비디오 처리 모드라고 하며, 각 모드는 GUID로 식별됩니다. 미리 정의된 GUID 목록은 IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids를 참조하세요. 드라이버는 다양한 기능 조합을 나타내는 추가 공급업체별 GUID를 정의할 수 있습니다.

지원되는 모드 및 각 모드의 기능을 찾으려면 다음을 수행합니다.

  1. IMFGetService::GetService를 호출하여 믹서의 IMFVideoProcessor 인터페이스에 대한 포인터를 가져옵니다.

  2. IMFVideoProcessor::GetAvailableVideoProcessorModes를 호출 합니다. 이 메서드는 사용 가능한 비디오 프로세서 모드를 식별하는 GUID 배열을 반환합니다. 목록은 내림차순으로 반환되며, 가장 높은 품질을 가진 모드가 목록에서 먼저 표시됩니다. 비디오의 형식에 따라 목록이 변경 될 수 있습니다.

  3. 목록의 각 GUID에 대해 IMFVideoProcessor::GetVideoProcessorCaps를 호출하여 해당 비디오 프로세서 모드의 기능을 찾습니다. 메서드는 기능에 대한 설명으로 DXVA2_VideoProcessorCaps 구조를 채웁니다.

  4. 모드를 선택하려면 IMFVideoProcessor::SetVideoProcessorMode를 호출합니다. 그렇지 않으면 스트리밍이 시작될 때 EVR이 자동으로 모드를 선택합니다. 이 경우 IMFVideoProcessor::GetVideoProcessorMode를 호출하여 선택된 모드를 찾을 수 있습니다.

DXVA2_VideoProcessorCaps 구조의 대부분의 필드는 하위 수준 드라이버 동작을 설명하며 일반적인 애플리케이션에는 관심이 없습니다. 다음 필드가 가장 관심을 가질 만한 필드는 다음과 같습니다.

  • DeviceCaps. 이 필드는 하드웨어 또는 소프트웨어에서 비디오 처리가 수행되는지 여부와 그래픽 드라이버가 이전 DXVA 1.0 드라이버인지 여부를 나타냅니다.

  • DeinterlaceTechnology. 이 필드는 원본 비디오가 인터레이스되는 경우 예상할 수 있는 디인터레이스 품질 수준을 나타냅니다.

  • ProcAmpControlCaps. 이 필드는 사용할 수 있는 색 조정 컨트롤을 지정합니다. 가능한 색 조정 목록은 ProcAmp 설정 참조하세요. 드라이버가 색 조정을 수행할 수 없는 경우 이 필드는 0입니다.

  • VideoProcessorOperations. 이 필드에는 기타 비디오 처리 기능을 설명하는 플래그가 포함되어 있습니다. 특히 중요한 두 플래그는 DXVA2_VideoProcess_Sub스트림 플래그와 DXVA2_VideoProcess_Sub스트림 플래그입니다. EVR이 하위 스트림을 참조 비디오 스트림에 혼합하려면 이러한 플래그 중 하나 이상이 있어야 합니다. 두 플래그가 모두 없는 경우 EVR은 하나의 비디오 스트림으로 제한됩니다.

  • NoiseFilterTechnology. 이 필드는 그래픽 드라이버에서 지원하는 노이즈 필터를 나타냅니다. 드라이버가 노이즈 필터링을 지원하지 않으면 값이 DXVA2_NoiseFilterTech_Unsupported.

  • DetailFilterTechnology. 이 필드는 그래픽 드라이버에서 지원하는 세부 정보 필터를 나타냅니다. 드라이버가 노이즈 필터링을 지원하지 않으면 값이 DXVA2_DetailFilterTech_Unsupported.

색 조정 및 이미지 필터링

그래픽 드라이버는 색 조정(프로세스 증폭 또는 단순히 ProcAmp라고도 함) 및 이미지 필터링을 지원할 수 있습니다. GPU에서 수행하는 경우 CPU 오버헤드 없이 실시간으로 색 조정 및 이미지 필터링을 수행할 수 있습니다.

이러한 기능을 사용하려면 다음 단계를 수행합니다.

  1. 이전 섹션에서 설명한 대로 비디오 처리 모드를 선택합니다.

  2. 이전 섹션에서 설명한 대로 IMFVideoProcessor::GetVideoProcessorCaps를 호출하여 비디오 처리 기능을 찾습니다. 이 메서드는 드라이버가 색상 조정 및 이미지 필터를 지원하는지 여부를 포함하여 기능을 설명하는 DXVA2_VideoProcessorCaps 구조를 채웁니다.

  3. 드라이버에서 지원하는 각 색 조정에 대해 IMFVideoProcessor::GetProcAmpRange를 호출하여 해당 설정에 대해 가능한 값 범위를 찾습니다. 이 메서드는 설정의 기본값도 반환합니다. IMFVideoProcessor::GetProcAmpValues를 호출하여 설정의 현재 값을 찾습니다. 값에 지정된 단위가 없습니다. 값 범위를 정의하는 것은 드라이버에 달려 있습니다.

  4. IMFVideoProcessor::SetFilteringValue를 호출하여 색 조정 값을 설정합니다.

  5. 드라이버가 이미지 필터링을 지원하는 경우 각 필터 유형(노이즈 및 세부 정보)은 크로마와 윤활유 모두에서 세 가지 설정(수준, 반경 및 임계값)을 지원합니다. (참조)DXVA 이미지 필터 설정.) 각 설정에 대해 IMFVideoProcessor::GetFilteringRange를 호출하여 가능한 값의 범위를 얻고 IMFVideoProcessor::GetFilteringValue를 호출하여 현재 값을 가져옵니다.

  6. 이미지 필터 설정을 변경하려면 IMFVideoProcessor::SetFilteringValue를 호출 합니다.

향상된 비디오 렌더러