服务接口
媒体基础中的某些接口必须通过调用 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 | 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。
注意
对象可以通过 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);
相关主题