Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Often an application requires to list all the Audio/Video compressors installed on the machine. We can achieve this
easily with
the ICreateDevEnum interface available from DirectShow. ICreateDevEnum exposes
a method named CreateClassEnumerator that allows us to create enumerators
for different categories of devices, such as audio/video codecs, Directx Media
Objects (DMO) etc.
The typical usage is as shown below:
CComPtr<ICreateDevEnum> pSysDevEnum;
if(FAILED(hr = pSysDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum)))
{
return hr;
}
IEnumMoniker *pEnum = NULL;
hr = pSysDevEnum->CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnum, 0);
if (hr == S_OK)
{
// Use the pEnum to enumerate the devices
...
// Do not forget to release it when done.
pEnum->Release();
}
The below code enumerates the Audio compressors available on the
machine and adds their friendly names to an application defined combo box.
HRESULT CAudioConvertDlg::AddCompressorsToComboList(CString *pStrErrMsg)
{
HRESULT hr = E_FAIL;
this->m_ctrlCompressorsCombo.ResetContent();
CComPtr<ICreateDevEnum> pCreateDevEnum;
if(FAILED(hr = pCreateDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum)))
{
*pStrErrMsg += "Unable to Create System Device Enumerator"; return hr;
}
CComPtr<IEnumMoniker> pEnumMoniker;
if(FAILED(hr = pCreateDevEnum->CreateClassEnumerator(CLSID_AudioCompressorCategory,&pEnumMoniker,0)))
{
*pStrErrMsg += "Unable to Create AudioCompressor Enumerator"; return hr;
}
CComPtr<IMoniker> pMoniker;
while(pEnumMoniker->Next(1,&pMoniker,NULL) == S_OK)
{
CComPtr<IPropertyBag> pBag; // Use the Moniker's PropertyBag to get the Object's name
if(SUCCEEDED(pMoniker->BindToStorage(0,0,IID_IPropertyBag,(void**)&pBag)))
{
VARIANT var;
var.vt = VT_BSTR;
if(SUCCEEDED(pBag->Read(L"FriendlyName",&var,NULL)))
{
TCHAR szName[512];
GetTcharFromWchar(var.bstrVal,szName,sizeof(szName));
SysFreeString(var.bstrVal);
this->m_ctrlCompressorsCombo.AddString(szName);
}
}
pMoniker.Release();
}
this->m_ctrlCompressorsCombo.SetCurSel(0);
return hr = S_OK; // Everything went fine !!
}
Comments
Anonymous
May 19, 2009
I try this, but not all directshow codec can be list.Anonymous
May 19, 2009
i don't find out audio compress codec.