Помогите с захватом видео

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем RG84, 15 ноя 2006.

  1. RG84

    RG84 Гость

    задача следующая:
    требуется получить видео с камеры подключенной к компу.
    посоветуйте как это лучше сделать. и если не трудно приведите примерчик. :huh:
     
  2. RG84

    RG84 Гость

    Нашла вот такой пример

    HRESULT FindMyCaptureDevice(IBaseFilter **pF, BSTR bstrName)
    {
    HRESULT hr = E_FAIL;
    CComPtr<IBaseFilter> pFilter;
    CComPtr<ICreateDevEnum> pSysDevEnum;
    CComPtr<IEnumMoniker> pEnumCat = NULL;

    // Create the System Device Enumerator.
    pSysDevEnum.CoCreateInstance(CLSID_SystemDeviceEnum);

    pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    // Enumerate the monikers.
    CComPtr<IMoniker> pMoniker;
    ULONG cFetched;
    while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
    {
    CComPtr<IPropertyBag> pProp;
    pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pProp);
    VARIANT varName;
    VariantInit(&varName); // Try to match the friendly name.
    hr = pProp->Read(L"FriendlyName", &varName, 0);
    if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
    {
    hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
    break;
    }
    VariantClear(&varName);
    pMoniker = NULL; // Release for the next loop.
    }

    *pF = pFilter;
    (*pF)->AddRef(); // Add ref on the way out.
    return hr;
    }

    void DoCapture()
    {
    // e436eb88-524f-11ce-9f53-0020af0ba770 MEDIASUBTYPE_Avi

    HRESULT hr;
    CComBSTR bstrName("My Camera Device");
    CComPtr<IBaseFilter> pSrc;
    CComPtr<IGraphBuilder> pGraph=NULL;
    CComPtr<ICaptureGraphBuilder2> pBuilder=NULL;

    // Create the filter graph.
    CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
    IID_IGraphBuilder, (void **)&pGraph);

    // Create the capture graph builder.
    CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC,
    IID_ICaptureGraphBuilder2, (void **)&pBuilder);

    pBuilder->SetFiltergraph(pGraph);

    hr = FindMyCaptureDevice(&pSrc, bstrName);
    hr = pGraph->AddFilter(pSrc, L"Capture");

    // Create the file-writing portion.
    CComPtr<IBaseFilter> ppf;
    hr = pBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi1,
    L"C:\\Example.avi", &ppf, NULL);

    // Render streams.
    hr = pBuilder->RenderStream(
    &PIN_CATEGORY_CAPTURE1, // Pin category
    &MEDIATYPE_Video1, // Media type
    pSrc, // Capture filter
    NULL, // Compression filter (optional)
    ppf // Multiplexer or renderer filter
    );
    hr = pBuilder->RenderStream(
    &PIN_CATEGORY_PREVIEW1, // Pin category
    &MEDIATYPE_Video1, // Media type
    pSrc, // Capture filter
    NULL, // Compression filter (optional)
    NULL // Default renderer
    );

    // Run the graph.
    const long ONE_SECOND = 10000000;
    REFERENCE_TIME rtStart = 5 * ONE_SECOND , rtStop = 10 * ONE_SECOND;
    hr = pBuilder->ControlStream(&PIN_CATEGORY_CAPTURE1, &MEDIATYPE_Video1,
    pSrc, &rtStart, &rtStop, 0, 0);
    if (FAILED(hr))
    {
    printf("Failed ControlStream.\n");
    return;
    }
    CComQIPtr<IMediaControl> pControl(pGraph);
    CComQIPtr<IMediaEventEx> pEvent(pGraph);
    hr = pControl->Run();
    while (1)
    {
    long evCode, lParam1, lParam2;
    hr = pEvent->GetEvent(&evCode, &lParam1, &lParam2, 100);
    if (hr == S_OK)
    {
    hr = pEvent->FreeEventParams(evCode, lParam1, lParam2);
    if (evCode == EC_STREAM_CONTROL_STARTED)
    {
    printf("Starting capture...\n");
    }
    else if (evCode == EC_STREAM_CONTROL_STOPPED)
    {
    break;
    }
    }
    }
    pControl->Stop();
    printf("... Done\n");
    }


    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    CoInitialize(NULL);
    DoCapture();
    CoUninitialize();
    }
    //--------------------------------------------------------------------

    но почемуто в
    pSysDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnumCat, 0);
    pEnumCat получается NULL и из-за этого далише ничего не работает... :)
    посоветуйте что с этим делать???
     
  3. sdriver

    sdriver Гость

    А есть ли подключенные VideoInputDevice?
     
  4. RG84

    RG84 Гость

    да
    более того усли вместо CLSID_VideoInputDeviceCategory поставить AM_KSCATEGORY_CAPTURE
    то почти работает...
    но прога не заходит в
    if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
    {
    hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
    break;
    }
    и из-за этого не работает
     
  5. sdriver

    sdriver Гость

    Для уточнения ошибки:
    1. Вставь проверку на связывание с IPropertyBag
    Код (Text):
         hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
    (void **)&pProp);
    if (SUCCEEDED(hr))
    2. Что конкретно не проходит (SUCCEEDED(hr)) или wcscmp(bstrName, varName.bstrVal)?
    И какое у тебя значения varName.bstrVal?
    Код (Text):
     if (SUCCEEDED(hr) && (wcscmp(bstrName, varName.bstrVal) == 0))
    {
    hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
    break;
    }
     
  6. RG84

    RG84 Гость

    1 проверку вставила
    2 не проходило wcscmp(bstrName, varName.bstrVal)
    я зделала по другому (правдо не знаю на ск это правелно или нет)
    hr = pProp->Read(L"FriendlyName", &varName, 0);
    wchar_t *Name=varName.bstrVal;

    char *mbst = (char*)malloc( MB_CUR_MAX);
    char *mbst1 = (char*)malloc( MB_CUR_MAX);
    int x = wcstombs(mbst,bstrName, MB_CUR_MAX);
    int x1 = wcstombs(mbst1,Name, MB_CUR_MAX);

    if (SUCCEEDED(hr) && (strcmp(mbst,mbst1) == 0))

    {
    hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pFilter);
    break;
    }

    и теперь не выполняется
    hr = pBuilder->RenderStream(
    &PIN_CATEGORY_CAPTURE1 , // Pin category
    &MEDIATYPE_Video1, // Media type
    pSrc, // Capture filter
    NULL, // Compression filter (optional)
    ppf // Multiplexer or renderer filter
    );
    hr = pBuilder->RenderStream(
    &PIN_CATEGORY_PREVIEW1, // Pin category
    &MEDIATYPE_Video1, // Media type
    pSrc, // Capture filter
    NULL, // Compression filter (optional)
    NULL // Default renderer
    );
     
  7. sdriver

    sdriver Гость

    А проверки на все стоят?B частности на все что касается pSrc, // Capture filter
     
  8. RG84

    RG84 Гость

    пока не на все....
    но при пошаговом выполнение вроде все что с ним связано нормално выполняется (hr=0)
     
  9. RG84

    RG84 Гость

    посоветуйте что исправить или что сделать...плиз....
    очень надо!!!!
     
  10. sdriver

    sdriver Гость

    MEDIATYPE_Video1. Почему не MEDIATYPE_Video?
     
  11. RG84

    RG84 Гость

    я их вначале описала
    GUID MEDIASUBTYPE_Avi1 ={0xe436eb88, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70};
    GUID PIN_CATEGORY_CAPTURE1={0xfb6c4281, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba };
    GUID MEDIATYPE_Video1={0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71};
    GUID PIN_CATEGORY_PREVIEW1={0xfb6c4282, 0x0353, 0x11d1, 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba };
    GUID CLSID_VideoInputDeviceCategory1={0x860BB310,0x5D01,0x11d0,0xBD,0x3B,0x00,0xA0,0x
    C9,0x11,0xCE,0x86};
    GUID AM_KSCATEGORY_CAPTURE1={0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96};
    GUID MEDIATYPE_Interleaved1={0x73766169, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71};
    иначе, при MEDIATYPE_Video, выдавалась ошибка... мол такого не знает
     
Загрузка...
Похожие Темы - Помогите захватом видео
  1. limbra
    Ответов:
    3
    Просмотров:
    43
  2. NylevoiChelovek
    Ответов:
    4
    Просмотров:
    93
  3. Ruska132
    Ответов:
    34
    Просмотров:
    252
  4. gURaBA_N
    Ответов:
    7
    Просмотров:
    141
  5. uxbmw3w
    Ответов:
    0
    Просмотров:
    58

Поделиться этой страницей