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");
}
↑TOP