Видео для Windows
От: Neste Беларусь  
Дата: 28.08.02 13:49
Оценка:
Мне необходимо выводить на экран изображение с видеовхода виедокарты.
Пользуюсь AVICap классом окна (capCreateCaptureWindow() и т.д).
Как еще можно вывести изображение с видеовхода (технологии,классы)?
AVICap не предоставляет достаточно возможностей и очень плохо документирован.

Заранее благодарен.
Re: Видео для Windows
От: visitant Украина  
Дата: 28.08.02 15:08
Оценка:
Что-то типа такого (пример кода в DirectX SDK)

#include <dshow.h>
#include <atlbase.h>
#include <stdio.h>

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);
    // Obtain a class enumerator for the video compressor category.
    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()
{
    HRESULT hr;
    CComBSTR bstrName("My Camera Device");
    CComPtr<IBaseFilter> pSrc;
    CComPtr<IGraphBuilder> pGraph;
    CComPtr<ICaptureGraphBuilder2> pBuilder;
    
    // Create the filter graph.
    hr = pGraph.CoCreateInstance(CLSID_FilterGraph);
    
    // Create the capture graph builder.
    hr = pBuilder.CoCreateInstance(CLSID_CaptureGraphBuilder2);
    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_Avi, 
             L"C:\\Example.avi", &ppf, NULL);

    // Render streams.
    hr = pBuilder->RenderStream(
        &PIN_CATEGORY_CAPTURE,  // Pin category
        &MEDIATYPE_Video,       // Media type
        pSrc,                   // Capture filter
        NULL,                   // Compression filter (optional)
        ppf                     // Multiplexer or renderer filter
    );
    hr = pBuilder->RenderStream(
        &PIN_CATEGORY_PREVIEW,  // Pin category
        &MEDIATYPE_Video,       // 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_CAPTURE, &MEDIATYPE_Video, 
        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");
}

int __cdecl main()
{
    CoInitialize(NULL);
    DoCapture();        
    CoUninitialize();
    return 0;
}


В общем читать тут:
DirectX SDK->Direct Show
Примеры:AmCap, AudioCap< PlayCap и т.д.
Тут есть народ, который этим занимается


Re[2]: Видео для Windows
От: Neste Беларусь  
Дата: 28.08.02 15:24
Оценка:
Ага! Значит еще DirectX (DirectShow)!

А еще? Что насчет MCI?

С AVICap окном я не могу реализовать некоторые вещи,
например мне необходимо поверх "живого" видео вывести свою (простейшую)
графику (простой прямоугольник).

Или прогрммно поменять яркость, контраст и т.д.
Для этого оно предоставляет свой диалог: capDlgVideoSource().
Документация в MSDN очень скудная.
Re[3]: Видео для Windows
От: Snax Россия  
Дата: 29.08.02 01:07
Оценка:
Здравствуйте Neste, Вы писали:

N>С AVICap окном я не могу реализовать некоторые вещи,

N>например мне необходимо поверх "живого" видео вывести свою (простейшую)
N>графику (простой прямоугольник).

В DShow есть понятие Transform-фильтров. Это то, о чем ты спрашивал.

N>Или прогрммно поменять яркость, контраст и т.д.

N>Для этого оно предоставляет свой диалог: capDlgVideoSource().

Есть стандартный фильтр contrast. Причем в исходниках.
Иди учи DirectShow и не возврвщайся, пока не выучишь

Павел.
Re[4]: Видео для Windows
От: Neste Беларусь  
Дата: 29.08.02 06:30
Оценка:
S>Иди учи DirectShow и не возврвщайся, пока не выучишь

S>Павел.



Спасибо! Видимо так и придется поступить!
Re[5]: Видео для Windows
От: ShootNik  
Дата: 04.11.02 09:54
Оценка:
Не могли вы кинуть ссылочку, где можно было бы разобраться с выводом данных с видеокарты в полноэкранное приложение и при этом поверх рисовать примитивы. Спасибо
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.