사용자 지정 믹서

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

이 항목에서는 향상된 EVR(비디오 렌더러)에 대한 사용자 지정 믹서를 작성하는 방법을 설명합니다. Media Foundation EVR 미디어 싱크 또는 DirectShow EVR 필터에서 사용자 지정 믹서를 사용할 수 있습니다. 믹서 및 발표자에 대한 자세한 내용은 향상된 비디오 렌더러를 참조 하세요.

믹서는 하나 이상의 입력(참조 스트림 및 하위 스트림)과 하나의 출력이 있는 MFT(Media Foundation 변환)입니다. 입력 스트림은 업스트림 샘플을 받습니다. 출력 스트림은 발표자에게 샘플을 제공합니다. EVR은 믹서에서 IMFTransform::P rocessInput을 호출할 책임이 있으며 발표자는 IMFTransform::P rocessOutput을 호출할 책임이 있습니다.

최소한 EVR 믹서는 다음 인터페이스를 구현해야 합니다.

인터페이스 설명
IMFTransform 기본 MFT 기능을 제공합니다.
IMFTopologyServiceLookupClient 믹서가 EVR에서 인터페이스를 가져올 수 있도록 합니다.
IMFVideoDeviceID 믹서가 EVR에서 인터페이스를 가져올 수 있도록 합니다.
IMFAttributes MF_SA_D3D_AWARE 특성을 EVR에 노출하는 데 사용됩니다.

 

필요에 따라 MFT는 다음 인터페이스를 구현할 수 있습니다.

인터페이스 설명
IEVRTrustedVideoPlugin 보호된 콘텐츠를 재생하는 데 필요합니다.
IMFGetService 애플리케이션에 IMFVideoMixerBitmap 및 IMFVideoProcessor같은 인터페이스를 노출합니다.
IMFQualityAdvise 품질 관리자가 비디오 품질을 조정할 수 있도록 합니다.
IMFVideoMixerBitmap 애플리케이션이 정적 비트맵을 비디오에 혼합할 수 있도록 합니다.
IMFVideoPositionMapper 출력 비디오 프레임의 좌표를 입력 비디오 프레임의 좌표로 지도.
IMFVideoProcessor 애플리케이션에 일부 DXVA 비디오 처리 기능을 노출합니다.

 

믹서와의 형식 협상은 다음과 같이 작동합니다.

  1. EVR은 참조 스트림의 미디어 형식을 설정합니다.

  2. EVR은 MFVP_MESSAGE_INVALIDATEMEDIATYPE 메시지와 함께 발표자에서 IMFVideoPresenter::P rocessMessage호출합니다.

  3. 발표자는 믹서의 출력 스트림에서 미디어 형식을 설정합니다.

  4. EVR은 하위 스트림의 미디어 형식을 설정합니다.

참조 스트림의 미디어 형식이 변경되면 믹서의 다른 미디어 형식이 더 이상 유효하지 않습니다. 믹서의 IMFTransform::P rocessOutput 메서드가 실패하고 MF_E_TRANSFORM_STREAM_CHANGE 반환합니다. 발표자는 이 시점에서 아무 작업도 수행해서는 안 됩니다. EVR은 형식 협상 프로세스를 다시 시작합니다.

입력 스트림이 스트림의 끝에 도달하면 EVR은 MFT_MESSAGE_NOTIFY_END_OF_STREAM 믹서에서 IMFTransform::P rocessMessage를 호출합니다.

믹서는 EVR의 IMediaEventSink 인터페이스를 사용하여 EVR에 다음 이벤트를 보냅니다. 이 인터페이스는 DirectShow SDK 설명서에 설명되어 있습니다.

이벤트 설명
EC_SAMPLE_NEEDED 믹서에는 새 입력 샘플이 필요합니다.

 

스트리밍이 시작되기 전에 EVR이 믹서에서 ProcessOutput을 호출할 수 있습니다. 믹서는 이러한 호출에 실패하지 않아야 합니다. 대신 출력 화면을 검은색 픽셀로 채워야 합니다. 믹서는 MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 메시지를 받거나 ProcessInput 메서드가 호출될 때까지 출력 샘플을 색으로 채웁니다. 믹서가 MFT_MESSAGE_NOTIFY_END_STREAMING 메시지를 받으면 색 채우기 모드로 다시 전환해야 합니다.

IMFVideoDeviceID 구현

IMFVideoDeviceID 인터페이스에는 디바이스 GUID를 반환하는 GetDeviceID라는 하나의 메서드가 포함되어 있습니다. 디바이스 GUID를 사용하면 발표자와 믹서가 호환되는 기술을 사용할 수 있습니다. 디바이스 GUID가 일치하지 않으면 EVR이 초기화되지 않습니다.

표준 믹서와 발표자는 모두 장치 GUID가 IID_IDirect3DDevice9 동일한 Direct3D 9를 사용합니다. 표준 믹서에서 사용자 지정 발표자를 사용하려는 경우 발표자의 디바이스 GUID는 IID_IDirect3DDevice9 합니다. 두 구성 요소를 모두 바꾸면 새 디바이스 GUID를 정의할 수 있습니다.

IMFTopologyServiceLookupClient 구현

믹서는 IMFTopologyServiceLookupClient 인터페이스를 구현해야 합니다. 스트리밍을 시작하기 전에 EVR은 IMFTopologyServiceLookupClient::InitServicePointers를 호출하고 EVR의 IMFTopologyServiceLookup 인터페이스에 대한 포인터를 전달합니다. 믹서는 이 포인터를 사용하여 EVR에서 인터페이스 포인터를 가져옵니다.

최소한 믹서는 다음 인터페이스를 쿼리해야 합니다.

EVR이 IMFTopologyServiceLookupClient::ReleaseServicePointers를 호출하는 경우 믹서는 InitServicePointers 호출에서 가져온 모든 포인터를 해제해야 합니다.

Mixer 특성

믹서는 다음 특성을 지원해야 합니다.

attribute 설명
MF_SA_D3D_AWARE 믹서가 DXVA(DirectX Video Acceleration)를 지원하는지 여부를 지정합니다.
MF_SA_REQUIRED_SAMPLE_COUNT EVR이 각 믹서 스트림에 할당해야 하는 비디오 샘플의 수입니다. 이 특성은 개별 스트림에 적용됩니다. 는 IMFTransform::GetInputStreamAttributes에서 반환 된 특성 저장소를 사용합니다.

 

EVR에서 Mixer 설정

EVR에서 사용자 지정 믹서 설정하려면 IMFVideoRenderer::InitializeRenderer를 호출 합니다. DirectShow EVR 필터와 EVR 미디어 싱크 모두 이 메서드를 구현합니다.

EVR 활성화 개체입니다. EVR 활성화 개체를 사용하는 경우 EVR 활성화 개체에서 다음 특성 중 하나를 설정하여 사용자 지정 믹서가 제공됩니다.

attribute 설명
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_ACTIVATE 믹서의 활성화 개체에 대한 포인터입니다. 활성화 개체는 IMFActivate 인터페이스를 구현해야 합니다.
MF_ACTIVATE_CUSTOM_VIDEO_MIXER_CLSID 믹서의 CLSID입니다.

 

향상된 비디오 렌더러