이것은 DirectShow에서 가장 잘 처리됩니다.
DirectShow는 현재 플랫폼 SDK의 일부입니다.
HRESULT extractFriendlyName(IMoniker* pMk, std::wstring& str)
{
assert(pMk != 0);
IPropertyBag* pBag = 0;
HRESULT hr = pMk->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
if(FAILED(hr) || pBag == 0)
{
return hr;
}
VARIANT var;
var.vt = VT_BSTR;
hr = pBag->Read(L"FriendlyName", &var, NULL);
if(SUCCEEDED(hr) && var.bstrVal != 0)
{
str = reinterpret_cast<wchar_t*>(var.bstrVal);
SysFreeString(var.bstrVal);
}
pBag->Release();
return hr;
}
HRESULT enumerateDShowFilterList(const CLSID& category)
{
HRESULT rval = S_OK;
HRESULT hr;
ICreateDevEnum* pCreateDevEnum = 0; // volatile, will be destroyed at the end
hr = ::CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, reinterpret_cast<void**>(&pCreateDevEnum));
assert(SUCCEEDED(hr) && pCreateDevEnum != 0);
if(FAILED(hr) || pCreateDevEnum == 0)
{
return hr;
}
IEnumMoniker* pEm = 0;
hr = pCreateDevEnum->CreateClassEnumerator(category, &pEm, 0);
// If hr == S_FALSE, no error is occured. In this case pEm is NULL, because
// a filter does not exist e.g no video capture devives are connected to
// the computer or no codecs are installed.
assert(SUCCEEDED(hr) && ((hr == S_OK && pEm != 0) || hr == S_FALSE));
if(FAILED(hr))
{
pCreateDevEnum->Release();
return hr;
}
if(hr == S_OK && pEm != 0) // In this case pEm is != NULL
{
pEm->Reset();
ULONG cFetched;
IMoniker* pM = 0;
while(pEm->Next(1, &pM, &cFetched) == S_OK && pM != 0)
{
std::wstring str;
if(SUCCEEDED(extractFriendlyName(pM, str))
{
// str contains the friendly name of the filter
// pM->BindToObject creates the filter
std::wcout << str << std::endl;
}
pM->Release();
}
pEm->Release();
}
pCreateDevEnum->Release();
return rval;
}
다음 호출은 콘솔에 모든 비디오 압축기를 열거 :
enumerateDShowFilterList(CLSID_VideoCompressorCategory);
MSDN의 페이지를 Filter Categories 목록 다른 모든 '공식'카테고리를.
나는 그것이 당신을위한 좋은 출발점이되기를 바랍니다.
다음을 추가 할 수 있습니다. http://msdn.microsoft.com/en-us/library/windows/desktop/dd375655(v=vs.85).aspx "페이지 맨 아래에 카테고리 CLSID_LegacyAmFilterCategory는 오디오 디 컴프레서 및 비디오 디 컴프레서로서 DirectShow가 액세스 가능한 DMO를 포함한 카테고리가된다. – sboisse