枚举系统中所有的Filter的代码,我刚刚找到,希望有人能用得到
void CVideoControl::GetAllVideoCaptureDevices(void)
{
// clear the vector
m_vCamSource.clear();
int i;
HRESULT hr;
IEnumMoniker *camEnum = NULL;
IMoniker *cam = NULL;
CComPtr<ICreateDevEnum> devEnum;
//Find the cameras
hr = devEnum.CoCreateInstance(CLSID_SystemDeviceEnum);
if (FAILED(hr)) exit(1);
hr = devEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&camEnum, 0);
if (FAILED(hr)) exit(1);
i = 0;
while (camEnum->Next(1, &cam, NULL) == S_OK)
{
USES_CONVERSION;
IPropertyBag *pPropBag;
IBaseFilter *camSrc;
VARIANT camName;
VariantInit(&camName);
//Get the name of the camera
hr = cam->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
if (FAILED(hr)) exit(1);
hr = pPropBag->Read(L"FriendlyName", &camName, 0);
if (FAILED(hr)) continue;
LPCTSTR cName = OLE2T(camName.bstrVal);
Msg(cName);
pPropBag->Release();
char filtName[500];
sprintf(filtName, "Cam %d", i);
hr = cam->BindToObject(0, 0, IID_IBaseFilter, (void **)&camSrc);
if (FAILED(hr)) continue;
m_vCamSource.push_back(camSrc);
hr = m_pGraph->AddFilter(camSrc, T2OLE(filtName));
if (FAILED(hr)) continue;
i++;
}
}
void Msg(const TCHAR *szFormat, ...)
{
TCHAR szBuffer[1024]; // Large buffer for long filenames or URLs
const size_t NUMCHARS = sizeof(szBuffer) / sizeof(szBuffer[0]);
const int LASTCHAR = NUMCHARS - 1;
// Format the input string
va_list pArgs;
va_start(pArgs, szFormat);
// Use a bounded buffer size to prevent buffer overruns. Limit count to
// character size minus one to allow for a NULL terminating character.
_vsntprintf(szBuffer, NUMCHARS - 1, szFormat, pArgs);
va_end(pArgs);
// Ensure that the formatted string is NULL-terminated
szBuffer[LASTCHAR] = TEXT('\0');
MessageBox(NULL, szBuffer, TEXT("PlayCap Message"), MB_OK | MB_ICONERROR);
}
以上是Capture Filter的枚举,可以取得系统中所有的视频采集设备相关的代码。
对应其他类别的Filter
可以把CLSID_VideoInputDeviceCategory换成
CLSID_AudioInputDeviceCategory Audio Capture Sources category
CLSID_AudioCompressorCategory Audio Compressors category
CLSID_AudioRendererCategory Audio Renderers category
CLSID_LegacyAmFilterCategory DirectShow Filters category
CLSID_MidiRendererCategory Midi Renderers category
CLSID_VideoInputDeviceCategory Video Capture Sources category
CLSID_VideoCompressorCategory Video Compressors category
CLSID_ActiveMovieCategories The seven categories of filters in DirectShow