Reader 개체에 대한 포인터 가져오기(DirectShow)
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 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;
}
관련 항목