Мне необходимо выводить на экран изображение с видеовхода виедокарты.
Пользуюсь AVICap классом окна (capCreateCaptureWindow() и т.д).
Как еще можно вывести изображение с видеовхода (технологии,классы)?
AVICap не предоставляет достаточно возможностей и очень плохо документирован.
Заранее благодарен.
Что-то типа такого

(пример кода в 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 и т.д.
Тут есть народ, который этим занимается
Здравствуйте Neste, Вы писали:
N>С AVICap окном я не могу реализовать некоторые вещи,
N>например мне необходимо поверх "живого" видео вывести свою (простейшую)
N>графику (простой прямоугольник).
В DShow есть понятие Transform-фильтров. Это то, о чем ты спрашивал.
N>Или прогрммно поменять яркость, контраст и т.д.
N>Для этого оно предоставляет свой диалог: capDlgVideoSource().
Есть стандартный фильтр contrast. Причем в исходниках.
Иди учи DirectShow и не возврвщайся, пока не выучишь
Павел.
S>Иди учи DirectShow и не возврвщайся, пока не выучишь
S>Павел.
Спасибо! Видимо так и придется поступить!
Не могли вы кинуть ссылочку, где можно было бы разобраться с выводом данных с видеокарты в полноэкранное приложение и при этом поверх рисовать примитивы. Спасибо