這最好由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 2012-11-23 03:51:08