服务接口

媒体基础中的某些接口必须通过调用 IMFGetService::GetService,而不是调用 QueryInterface 来获取。 GetService 方法的工作方式类似于 QueryInterface,但存在以下差异:

  • 除接口标识符外,它还需要一个服务标识符 GUID。
  • 它可以返回指向实现接口的另一个对象的指针,而不是返回指向所查询的原始对象的指针。

注意

IMFGetService 接口与某些其他 API 中使用的 IServiceProvider 接口非常相似。

 

服务是通过 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) 媒体源。
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 表面缓冲区
MR_CAPTURE_POLICY_VOLUME_SERVICE IMFSimpleAudioVolume 音频捕获源
MR_POLICY_VOLUME_SERVICE IMFSimpleAudioVolume 音频呈现器
MR_STREAM_VOLUME_SERVICE IMFAudioStreamVolume 音频呈现器
MR_VIDEO_ACCELERATION_SERVICE IDirect3DDeviceManager9IDirectXVideoAccelerationService 增强的视频呈现器 (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

注意

对象可以通过 QueryInterface 以及 GetService 以返回服务接口的方式实现。 但是,在需要 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);

IMFGetService 接口

媒体基础平台 API