서비스 인터페이스
Media Foundation의 일부 인터페이스는 QueryInterface이 아닌 IMFGetService::GetService를 호출하여 가져와야 합니다. GetService 메서드는 QueryInterface처럼 작동하지만 다음과 같은 차이점이 있습니다.
- 인터페이스 식별자 외에도 서비스 식별자 GUID를 사용합니다.
- 쿼리된 원래 개체에 대한 포인터를 반환하는 대신 인터페이스를 구현하는 다른 개체에 대한 포인터를 반환할 수 있습니다.
참고 항목
IMFGetService 인터페이스는 다른 API에 사용되는 IServiceProvider 인터페이스와 매우 유사합니다.
service는 IMFGetService 인터페이스를 통해 특정 개체 클래스에서 가져온 특정 인터페이스입니다. 정의되는 서비스는 다음과 같습니다.
서비스 식별자 | 인터페이스 | 이 서비스를 노출할 수 있는 개체 |
---|---|---|
MF_METADATA_PROVIDER_SERVICE | IMFMetadataProvider | 미디어 소스 |
MF_MEDIASOURCE_SERVICE | IMFMediaSource | Windows 8.1 이상에서 지원됩니다. |
MF_PMP_SERVER_CONTEXT | IMFPMPServer | PMP(보호된 미디어 경로) 미디어 세션입니다. |
MF_QUALITY_SERVICES | IMFQualityAdvise | 미디어 소스. |
MF_RATE_CONTROL_SERVICE | IMFRateControl | 미디어 원본, 미디어 세션 |
MF_RATE_CONTROL_SERVICE | IMFRateSupport | 미디어 원본, 미디어 싱크, 미디어 세션 |
MF_REMOTE_PROXY | IMFRemoteProxy | 원격 개체에 대한 프록시입니다. |
MF_SAMI_SERVICE | IMFSAMIStyle | 동기화된 SAMI(Synchronized Accessible Media Interchange) 미디어 원본입니다. |
MF_SOURCE_PRESENTATION_PROVIDER_SERVICE | IMFMediaSourcePresentationProvider | 시퀀서 소스 |
MF_TIMECODE_SERVICE | IMFTimecodeTranslate | ASF 미디어 소스. |
MF_TOPONODE_ATTRIBUTE_EDITOR_SERVICE | IMFTopologyNodeAttributeEditor | 미디어 세션 |
MF_WRAPPED_OBJECT | IMFByteStream | 래핑된 개체 |
MF_WRAPPED_BUFFER_SERVICE | Windows 8.1 이상에서 지원됩니다. |
|
MF_WRAPPED_SAMPLE_SERVIC | Windows 8.1 이상에서 지원됩니다. |
|
MF_WORKQUEUE_SERVICES | IMFWorkQueueServices | 미디어 세션 |
MFNET_SAVEJOB_SERVICE | IMFSaveJob | 바이트 스트림 |
MFNETSOURCE_STATISTICS_SERVICE | IPropertyStore | 네트워크 원본. 이 서비스를 사용하여 네트워크 통계를 검색합니다. MFNETSOURCE_STATISTICS 속성을 참조하세요. |
MR_AUDIO_POLICY_SERVICE | IMFAudioPolicy | 오디오 렌더러 |
MR_BUFFER_SERVICE | IDirect3DSurface9 | DirectX Surface 버퍼 |
MR_CAPTURE_POLICY_VOLUME_SERVICE | IMFSimpleAudioVolume | 오디오 캡처 원본 |
MR_POLICY_VOLUME_SERVICE | IMFSimpleAudioVolume | 오디오 렌더러 |
MR_STREAM_VOLUME_SERVICE | IMFAudioStreamVolume | 오디오 렌더러 |
MR_VIDEO_ACCELERATION_SERVICE | IDirect3DDeviceManager9, IDirectXVideoAccelerationService | 고급 비디오 렌더러(EVR) |
MR_VIDEO_ACCELERATION_SERVICE | IDirectXVideoMemoryConfiguration | DirectShow EVR 필터의 입력 핀 |
MR_VIDEO_ACCELERATION_SERVICE | IMFVideoSampleAllocator 인터페이스 | EVR 스트림 싱크. |
MR_VIDEO_MIXER_SERVICE | EVR 믹서에 의해 노출되는 다양한 인터페이스. 비디오 믹서 컨트롤 사용을 참조하세요. | EVR |
MR_VIDEO_RENDER_SERVICE | EVR 발표자가 노출하는 다양한 인터페이스입니다. 비디오 표시 컨트롤 사용을 참조하세요. | EVR |
MF_ACOUSTIC_ECHO_CANCELLATION_CONTROL_SERVICE | IAcousticEchoCancellationControl | AEC(음향 반향 제거) 효과. Windows 11, 버전 24H2에 도입되었습니다. |
MF_AUDIO_EFFECTS_MANAGER_SERVICE | IAudioEffectsManager | 미디어 소스. Windows 11, 버전 24H2에 도입되었습니다. |
GetService를 사용하여 이 테이블에 나열된 개체로부터 이 테이블에 나열된 인터페이스를 가져와야 합니다.
경우에 따라 인터페이스는 한 개체 클래스에 의해 서비스로 반환되고 다른 개체 클래스에 의해 QueryInterface를 통해 반환됩니다. 각 인터페이스에 대한 참조 페이지는 GetService를 사용해야 하는 시기와 QueryInterface를 사용해야 하는 시점을 나타냅니다.
주의
개체는 GetService뿐만 아니라 QueryInterface를 통해 서비스 인터페이스를 반환하는 방식으로 구현될 수 있습니다. 그러나 GetService가 필요할 때 QueryInterface를 사용하면 나중에 호환성 문제가 발생할 수 있습니다.
MFGetService 함수는 IMFGetService에 대한 개체를 쿼리한 다음 개체의 GetService 메서드를 호출하는 도우미 함수입니다.
예제
다음 예제에서는 IMFGetService에 대한 미디어 세션을 쿼리하고 IMFRateControl 인터페이스를 가져옵니다.
IMFGetService *pGetService = NULL;
IMFRateControl *pRateControl = NULL;
HRESULT hr = S_OK;
hr = pMediaSession->QueryInterface(
IID_IMFGetService,
(void**)&pGetService);
if (SUCCEEDED(hr))
{
hr = pGetService->GetService(
MF_RATE_CONTROL_SERVICE,
IID_IMFRateControl,
(void**)&pRateControl);
}
if (SUCCEEDED(hr))
{
// Use IMFRateControl. (Not shown.)
}
// Clean up.
SAFE_REELEASE(pGetService);
SAFE_RELEASE(pRateControl);
다음 예제는 이전 예제와 동일하지만 MFGetService 기능을 사용합니다.
IMFRateControl *pRateControl = NULL;
HRESULT hr = S_OK;
hr = MFGetService(
pMediaSession,
MF_RATE_CONTROL_SERVICE,
IID_IMFRateControl,
(void**) &pRateCtl
);
if (SUCCEEDED(hr))
{
// Use IMFRateControl. (Not shown.)
}
// Clean up.
SAFE_RELEASE(pRateControl);
관련 항목