服務介面
媒體基礎中的某些介面必須藉由 呼叫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 | 遠端物件的 Proxy。 |
MF_SAMI_SERVICE | IMFSAMIStyle | 同步處理的可存取媒體交換 (SAMI) 媒體來源。 |
MF_SOURCE_PRESENTATION_PROVIDER_SERVICE | IMFMediaSourcePresentationProvider | Sequencer 來源 |
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 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);
相關主題