DirectShow DirectShow 의 사용법 비디오 캡춰 캡춰 장치의 선택 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
캡춰 장치를 선택하려면 , 「System Device Enumerator 의 사용법」으로 설명하고 있도록(듯이),System Device Enumerator 를 사용한다. 이 헬퍼-개체는, 필터 카테고리에 의해 선택된 디바이스 모니커의 콜렉션을 돌려준다. (모니카란, 다른 개체에 관한 정보가 들어간 COM 개체이다. 애플리케이션으로 모니카를 사용하면 개체 자체는 생성 하지 않고 개체에 관한 정보를 취득할 수 있다. 다음에, 애플리케이션은 모니카를 사용해 개체를 생성 할 수 있다. 모니카의 더 자세한 정보는, Platform SDK 의 IMoniker 의 문서를 참조할것. )
캡춰 장치에는, 다음의 카테고리가 관계한다.
카테고리 GUID | 설명 |
CLSID_AudioInputDeviceCategory | 오디오 캡춰 장치 |
CLSID_VideoInputDeviceCategory | 비디오 캡춰 장치 |
1 개의 장치는 양쪽 모두의 카테고리로 나타나는 일이 있다. 다음 코드는, 비디오 캡춰 장치의 열거자를 생성 한다.
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
// 시스템 장치 열거자를 생성 한다.
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL,
CLSCTX_INPROC_SERVER, IID_ICreateDevEnum,
reinterpret_cast<void**>(&pDevEnum));
if (SUCCEEDED(hr))
{
// 비디오 캡춰 카테고리의 열거자를 생성 한다.
hr = pDevEnum->CreateClassEnumerator(
CLSID_VideoInputDeviceCategory,
&pEnum, 0);
}
IEnumMoniker 인터페이스는 IMoniker 인터페이스의 일람을 돌려준다. 각각은 디바이스 모니커를 나타낸다. 보통, 장치의 일람을 표시해, 사용자가 어느쪽이든 1 개을 선택할 수 있도록(듯이) 한다. 우선 IMoniker::BindToStorage 메서드를 호출한다. 이 메서드는 IPropertyBag 인터페이스 포인터를 돌려준다. 다음에,IPropertyBag::Read 를 호출해, 모니카로부터 프로퍼티를 읽어낸다. 다음과 같은 프로퍼티가 있다.
프로퍼티 | 설명 |
FriendlyName | 장치의 이름 |
Description | 장치의 설명 |
DevicePath | 일의의 캐릭터 라인 |
다음 샘플 코드는, 리스트 박스에 장치명을 넣는 방법을 나타내고 있다.
HWND hList; // 리스트 박스에의 핸들.
IMoniker *pMoniker = NULL;
while (pEnum->Next(1, &pMoniker, NULL) == S_OK)
{
IPropertyBag *pPropBag;
hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
(void**)(&pPropBag));
if (FAILED(hr))
{
pMoniker->Release();
continue; // 이번은 스킵 한다. 다음은 올바르게 움직일 가능성이 있다.
}
// 설명 또는 프렌들리명을 검색한다.
VARIANT varName;
VariantInit(&varName);
hr = pPropBag->Read(L"Description", &varName, 0);
if (FAILED(hr))
{
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
}
if (SUCCEEDED(hr))
{
// 애플리케이션의 리스트 박스에 추가한다.
USES_CONVERSION;
(long) SendMessage(hList, LB_ADDSTRING, 0,
(LPARAM) OLE2T(varName.bstrVal));
VariantClear(&varName);
}
pPropBag->Release();
pMoniker->Release();
}
사용자가 장치를 선택 하면, 모니카로 IMoniker::BindToObject 를 호출해, 장치의 캡춰 필터를 생성 한다. 다음에,AddFilter 를 호출해 필터 그래프에 필터를 추가한다.
IBaseFilter *pCap = NULL;
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**) &pCap);
if (SUCCEEDED(hr))
{
hr = m_pGraph->AddFilter(pCap, L"Capture Filter");
}