获取指向读者对象的指针 (DirectShow)
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
在某些情况下,例如,在确定在给定流上设置的数据单元扩展时,可能需要直接访问 Windows Media Format SDK 的 Reader 对象。 以下函数演示如何获取 Reader 对象本身上的 IWMReaderAdvanced2 接口:
#include <wmsdk.h>
HRESULT GetReaderAdvanced(IGraphBuilder *pGraph, IWMReaderAdvanced2** pReaderAdvanced2)
{
CComPtr<IEnumFilters> pEnum;
CComPtr<IBaseFilter> pFilter;
ULONG cFetched;
HRESULT hr = pGraph->EnumFilters(&pEnum);
if (FAILED(hr))
{
return hr;
}
while(pEnum->Next(1, &pFilter, &cFetched) == S_OK)
{
IWMHeaderInfo *pHI = NULL;
// Only the WM ASF Reader will have interface.
hr = pFilter->QueryInterface(__uuidof(IWMHeaderInfo), (void**)&pHI);
if (SUCCEEDED(hr))
{
// We use the IWMDRMReader interface only as a way to get
// a pointer to the Reader Object.
CComPtr<IWMDRMReader> pWMDRMReader;
CComQIPtr<IServiceProvider, &IID_IServiceProvider> pSP;
hr = pHI->QueryInterface(__uuidof(IServiceProvider), (void**)&pSP);
if (!pSP)
{
return E_NOINTERFACE;
}
hr = pSP->QueryService(IID_IWMDRMReader, IID_IWMDRMReader, (void **) &pWMDRMReader);
if (FAILED(hr))
{
return hr;
}
CComQIPtr<IWMReaderAdvanced2, &IID_IWMReaderAdvanced2> pRA2(pWMDRMReader);
if (pRA2)
{
*pReaderAdvanced2 = pRA2.Detach();
return S_OK;
}
}
pFilter.Release();
}
//if we get here, we didn't find the WM ASF Reader
return E_FAIL;
}
相关主题