есть такая задачка (м.б. достаточно тривиальна, но неизвестна для меня).
Необходимо брать видеопоток с видеокамеры и позазывать его в окошке.
Как это сделать? Один человек гнусный сказал, что он брал дамп памяти с видеокарты,
но так как он вроде не очень силен в программировании, то меня терзают смутные сомнения,
что это делается как-то по другому.
Так вот как?
В каком направлении рыть и разделы MSDN читать?
В последствии хотелось бы еще и записать.
Может тоже подскажете пути.
Если не сложно, пришлите и прямо на e-mail

ответы, а то очень нужно.
Здравствуйте Leonidius, Вы писали:
L>есть такая задачка (м.б. достаточно тривиальна, но неизвестна для меня).
L>Необходимо брать видеопоток с видеокамеры и позазывать его в окошке.
L>Как это сделать? Один человек гнусный сказал, что он брал дамп памяти с видеокарты,
L>но так как он вроде не очень силен в программировании, то меня терзают смутные сомнения,
L>что это делается как-то по другому.
L>Так вот как?
L>В каком направлении рыть и разделы MSDN читать?
L>:crash:
L>В последствии хотелось бы еще и записать.
L>Может тоже подскажете пути.
L>:user:
L>Если не сложно, пришлите и прямо на e-mail
ответы, а то очень нужно.
Ya ne znay eto li ty ischesh? No sdelay Search v MSDN na sledushie zagolovki:
— CapTest: AVICap Capture Window Class.
— VidCap: Full-Featured Video Capture Application.
Tam est' primery.
Ob'yasneniya nahodytsy v: Multimedia Macros.
Здравствуйте Leonidius, Вы писали:
L>есть такая задачка (м.б. достаточно тривиальна, но неизвестна для меня).
L>Необходимо брать видеопоток с видеокамеры и позазывать его в окошке.
DirectShow либо VideoForWindows.
пример из SDK к DirectX:
#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;
}
... по моему я это уже где-то писал ...
по поводу VfW смотри в MSDN: там все подробно расписанно.
Здравствуйте Leonidius, Вы писали:
L>есть такая задачка (м.б. достаточно тривиальна, но неизвестна для меня).
L>Необходимо брать видеопоток с видеокамеры и позазывать его в окошке.
L>Как это сделать? Один человек гнусный сказал, что он брал дамп памяти с видеокарты,
L>но так как он вроде не очень силен в программировании, то меня терзают смутные сомнения,
L>что это делается как-то по другому.
L>Так вот как?
L>В каком направлении рыть и разделы MSDN читать?
L>:crash:
L>В последствии хотелось бы еще и записать.
L>Может тоже подскажете пути.
L>:user:
L>Если не сложно, пришлите и прямо на e-mail
ответы, а то очень нужно.
В Качаешь DirectX 8.1 SDK,и далее ..\samples\Multimedia\DirectShow\Capture\